Version 2.0.0-dev.66.0

Merge commit '544358304d9c49f739c9853256be5135811cdd9d' into dev
diff --git a/.packages b/.packages
index e09d3e7..e5e9d80 100644
--- a/.packages
+++ b/.packages
@@ -82,6 +82,7 @@
 shelf_packages_handler:third_party/pkg/shelf_packages_handler/lib
 shelf_static:third_party/pkg/shelf_static/lib
 shelf_web_socket:third_party/pkg/shelf_web_socket/lib
+smith:pkg/smith/lib
 source_map_stack_trace:third_party/pkg/source_map_stack_trace/lib
 sourcemap_testing:pkg/sourcemap_testing/lib
 source_maps:third_party/pkg/source_maps/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 723a2e4..4fa15f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 2.0.0-dev.66.0
+
 ## 2.0.0-dev.65.0
 
 ### Tool Changes
diff --git a/DEPS b/DEPS
index e7712ec..d785eeb 100644
--- a/DEPS
+++ b/DEPS
@@ -35,8 +35,8 @@
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  "co19_rev": "d4b3fc9af414c990b4d22f313e533b275d2f27c5",
-  "co19_2_rev": "74562e984a81673b581e148b5802684d6df840d2",
+  "co19_rev": "9858ee7d79cf09b50d6b5bc13fb950ae5f357954",
+  "co19_2_rev": "c64be2141d1e4e9a883389d709ef6bf0477c1fcf",
 
   # As Flutter does, we pull buildtools, including the clang toolchain, from
   # Fuchsia. This revision should be kept up to date with the revision pulled
@@ -110,7 +110,7 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.4",
   "protobuf_tag": "0.7.1",
-  "pub_rev": "2258022cb7fd6ec43900d3b88012efb268020019",
+  "pub_rev": "58fe996eab8d54f28f5109c407ff0ab62fbd835d",
   "pub_semver_tag": "1.4.1",
   "quiver_tag": "0.29.0",
   "resource_rev":"af5a5bf65511943398146cf146e466e5f0b95cb9",
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index bad2ba0..ce1ff45 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -61,6 +61,7 @@
 % - Add appendix listing the major differences between 64-bit integers
 %   and JavaScript integers.
 % - Remove appendix on naming conventions.
+% - Make it explicit that "dynamic" is exported from dart:core.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -4052,7 +4053,8 @@
 \LMLabel{symbols}
 
 \LMHash{}
-A {\em symbol literal} denotes the name of a declaration in a Dart program.
+A {\em symbol literal} denotes a name that would be either
+a valid declaration name or a valid library name in a Dart program.
 
 \begin{grammar}
 {\bf symbolLiteral:}`\#' (operator $|$ (identifier (`{\escapegrammar .}' identifier)*))
@@ -4060,10 +4062,39 @@
 \end{grammar}
 
 \LMHash{}
-A symbol literal \code{\#\id} where \id{} does not begin with an underscore ('\code{\_}') is equivalent to the expression \code{\CONST{} Symbol('\id')}.
+A symbol literal \code{\#$id$} where $id$ is an identifier
+that does not begin with an underscore ('\code{\_}'),
+evaluates to an instance of \code{Symbol} representing the identifier $id$.
+All occurences of \code{\#$id$} evaluate to the same instance
+\commentary{(symbol instances are canonicalized)},
+and no other symbol literals evaluate to that \code{Symbol} instance
+or to a \code{Symbol} instance that is equal
+(according to the \code{==} operator \ref{equality}) to that instance.
 
 \LMHash{}
-A symbol literal \code{\#\_\id} evaluates to the object that would be returned by the call \code{MirrorSystem.getSymbol("\_\id", \metavar{libraryMirror})} where \metavar{libraryMirror} is an instance of the class \code{LibraryMirror} defined in the library \code{dart:mirrors}, reflecting the current library.
+A symbol literal \code{\#$id$.$id_2$\ldots$id_n$}
+where $id$ \ldots $id_n$ are identifiers,
+evaluates to an instance of \code{Symbol} representing that particular sequence of identifiers.
+All occurences of \code{\#$id$.$id_2$\ldots$id_n$} with the same sequence of identifiers
+evaluate to the same instance,
+and no other symbol literals evaluate to that \code{Symbol} instance
+or to a \code{Symbol} instance that is \code{==} to that instance.
+\commentary{This kind of symbol literal denotes the name of a library declaration. Library names are not subject to library privacy, even
+if some of its identifiers begin with an underscore.}
+
+\LMHash{}
+A symbol literal \code{\#\metavar{operator}} evaluates to an instance of \code{Symbol}
+representing that particular operator name.
+All occurences of \code{\#\metavar{operator}} evaluate to the same instance,
+and no other symbol literals evaluate to that \code{Symbol} instance
+or to a \code{Symbol} instance that is \code{==} to that instance.
+
+\LMHash{}
+A symbol literal \code{\#\_$id$}, evaluates to an instance of \code{Symbol}
+representing the private identifier \code{_$id} of the containing library.
+All occurences of \code{\#\_$id$} {\em in the same library} evaluate to the same instance,
+and no other symbol literals evaluate to that \code{Symbol} instance
+or to a \code{Symbol} instance that is \code{==} to that instance.
 
 \rationale{
 One may well ask what is the motivation for introducing literal symbols? In some languages, symbols are canonicalized whereas strings are not.
@@ -4075,7 +4106,7 @@
 This practice poses difficulties for reflective programs that refer to program declarations via strings.
 A string will refer to an identifier in the source, but the identifier will no longer be used in the minified code, and reflective code using these would fail.
 Therefore, Dart reflection uses objects of type \code{Symbol} rather than strings.
-Instances of \code{Symbol} are guaranteed to be stable with repeat to minification.
+Instances of \code{Symbol} are guaranteed to be stable with respect to minification.
 Providing a literal form for symbols makes reflective code easier to read and write.
 The fact that symbols are easy to type and can often act as convenient substitutes for enums are secondary benefits.
 }
@@ -4083,7 +4114,6 @@
 \LMHash{}
 The static type of a symbol literal is \code{Symbol}.
 
-
 \subsection{Lists}
 \LMLabel{lists}
 
@@ -5604,14 +5634,7 @@
 then if $g$ is a getter that forwards to a static getter, getter lookup fails.
 If the getter lookup succeeded,
 let $v_g$ be the value of the getter invocation $e.m$.
-Then the value of $i$ is the result of invoking the static method
-\code{Function.apply()}
-with arguments
-$v_g$,
-\code{[$o_1, \ldots, o_n$]},
-\code{\{$\#x_{n+1}$: $o_{n+1}, \ldots, \#x_{n+k}$: $o_{n+k}$\}},
-and
-\code{[$t_1, \ldots, t_r$]}.
+Now repeat from finding $f$ above, this time with $o$ being $v_g$ and $m$ being \code{call}.
 
 \LMHash{}
 If getter lookup has also failed,
@@ -5800,14 +5823,7 @@
 then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $S_{dynamic}$ with respect to $L$.
 If the getter lookup succeeded,
 let $v_g$ be the value of the getter invocation $\SUPER{}.m$.
-Then the value of $i$ is the result of invoking
-the static method
-\code{Function.apply()}
-with arguments
-$v_g,
-[o_1, \ldots, o_n],
-\{\#x_{n+1}: o_{n+1}, \ldots, \#x_{n+k}: o_{n+k}\},
-[t_1, \ldots, t_r]$.
+Now repeat from finding $f$ above, this time with $o$ being $v_g$ and $m$ being \code{call}.
 
 \LMHash{}
 If getter lookup has also failed,
@@ -10051,7 +10067,10 @@
 }
 
 \LMHash{}
-The name \DYNAMIC{} denotes a \code{Type} object even though \DYNAMIC{} is not a class.
+The built-in type declaration \code{dynamic},
+which is declared in the library \code{dart:core},
+denotes the \DYNAMIC{} type.
+When the name \DYNAMIC{} exported by \code{dart:core} is evaluated as an expression, it evaluates to a \code{Type} object representing the \DYNAMIC{} type, even though \DYNAMIC{} is not a class.
 
 \LMHash{}
 The built-in type declaration \code{FutureOr},
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index ad440e8..9af229f 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -108,6 +108,7 @@
   @override
   @failingTest
   test_super_mixins_disabled() {
+    // Disabling super mixins is not supported in the new FE.
     return super.test_super_mixins_disabled();
   }
 
diff --git a/pkg/analysis_server/tool/spec/generate_files b/pkg/analysis_server/tool/spec/generate_files
index df2802d1..0651cb2 100755
--- a/pkg/analysis_server/tool/spec/generate_files
+++ b/pkg/analysis_server/tool/spec/generate_files
@@ -54,7 +54,7 @@
 DART="${BUILD_DIR}/dart-sdk/bin/dart"
 
 declare -a VM_OPTIONS
-VM_OPTIONS+=("--checked")
+VM_OPTIONS+=("--enable-asserts")
 VM_OPTIONS+=("--packages=${PKG_FILE}")
 
 cd "${SCRIPT_DIR}"
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index e81260f..8739ccb 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.32.2
+
+* Improved const evaluation analysis (new errors for `const A(B())` if `B` is non-const).
+* Parser recovery improvements.
+
 ## 0.32.1
 
 * The Parser() class now by default will parse with optional new or const. This
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 18a2e6c..ab46a8d 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.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.
 
-@deprecated
 import 'dart:io';
 
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 60afc67..62593e5 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1369,6 +1369,17 @@
 
   @override
   TypeAlias computeNode();
+
+  /// Produces the function type resulting from instantiating this typedef with
+  /// the given type arguments.
+  ///
+  /// Note that for a generic typedef, this instantiates the typedef, not the
+  /// generic function type associated with it.  So, for example, if the typedef
+  /// is:
+  ///     typedef F<T> = void Function<U>(T, U);
+  /// then a single type argument should be provided, and it will be substituted
+  /// for T.
+  FunctionType instantiate(List<DartType> argumentTypes);
 }
 
 /**
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 1557389..2b24f8c 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -81,7 +81,7 @@
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
-  CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
+  CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
   CompileTimeErrorCode.CONST_DEFERRED_CLASS,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index df71b24..33a23f7 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,7 +95,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 61;
+  static const int DATA_VERSION = 62;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index 03f505c..eb7f1d8 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -218,7 +218,8 @@
 
         // Compute new outlines.
         var newComponent = await _logger.runAsync('Compile', () async {
-          return await kernelTarget.buildOutlines(nameRoot: _component.root);
+          await kernelTarget.buildOutlines(nameRoot: _component.root);
+          return await kernelTarget.buildComponent();
         });
 
         // Add new libraries to the current component.
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 709f366..a7510b0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -1151,6 +1151,8 @@
       element = resynthesizer
           .getElementFromCanonicalName(referencedNode.classNode.canonicalName);
       assert(element != null);
+    } else if (referencedNode is kernel.DynamicType) {
+      element = DynamicElementImpl.instance;
     } else {
       throw new UnimplementedError(
           'TODO(paulberry): ${referencedNode.runtimeType}');
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index a15908f..50fa260 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -5491,8 +5491,17 @@
   GenericFunctionTypeElementImpl get function {
     if (_function == null) {
       if (_kernel != null) {
-        _function =
-            new GenericFunctionTypeElementImpl.forKernel(this, _kernel.type);
+        var kernelType = _kernel.type;
+        if (kernelType is kernel.FunctionType) {
+          _function =
+              new GenericFunctionTypeElementImpl.forKernel(this, kernelType);
+        } else {
+          // Error recovery.
+          _function = new GenericFunctionTypeElementImpl.forOffset(-1);
+          _function.enclosingElement = this;
+          _function.returnType = DynamicTypeImpl.instance;
+          _function.parameters = <ParameterElement>[];
+        }
       }
       if (_unlinkedTypedef != null) {
         if (_unlinkedTypedef.style == TypedefStyle.genericFunctionType) {
@@ -5647,6 +5656,15 @@
     return null;
   }
 
+  @override
+  FunctionType instantiate(List<DartType> argumentTypes) {
+    if (argumentTypes.length != typeParameters.length) {
+      throw new ArgumentError('Wrong number of type arguments supplied');
+    }
+    if (typeParameters.isEmpty) return function.type;
+    return typeAfterSubstitution(argumentTypes);
+  }
+
   /**
    * Return the type of the function defined by this typedef after substituting
    * the given [typeArguments] for the type parameters defined for this typedef
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index c3a659d..9695ed3c 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -693,6 +693,10 @@
 
   @override
   FunctionTypeAlias computeNode() => actualElement.computeNode();
+
+  @override
+  FunctionType instantiate(List<DartType> argumentTypes) =>
+      actualElement.instantiate(argumentTypes);
 }
 
 /**
@@ -732,6 +736,10 @@
 
   @override
   FunctionTypeAlias computeNode() => actualElement.computeNode();
+
+  @override
+  FunctionType instantiate(List<DartType> argumentTypes) =>
+      actualElement.instantiate(argumentTypes);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 5d1bada..e7ec4ad 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -484,14 +484,19 @@
    * specify a constant constructor of the superclass of the immediately
    * enclosing class or a compile-time error occurs.
    *
-   * 9 Mixins: For each generative constructor named ... an implicitly declared
-   * constructor named ... is declared.
+   * 12.1 Mixin Application: For each generative constructor named ... an
+   * implicitly declared constructor named ... is declared. If Sq is a
+   * generative const constructor, and M does not declare any fields, Cq is
+   * also a const constructor.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN =
-      const CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_MIXIN',
-          "Const constructor can't be declared for a class with a mixin.",
-          correction: "Try removing the 'const' keyword, or "
-              "removing the 'with' clause from the class declaration.");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD =
+      const CompileTimeErrorCode(
+          'CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD',
+          "Const constructor can't be declared for a class with a mixin "
+          "that declares a field.",
+          correction: "Try removing the 'const' keyword or "
+              "removing the 'with' clause from the class declaration, "
+              "or removing fields from the mixin class.");
 
   /**
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 9d1b45c..5471ac5 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -43,70 +43,44 @@
 
   @override
   void visitAnnotation(Annotation node) {
+    Identifier name = node.name;
     SimpleIdentifier constructorName = node.constructorName;
-    SyntacticEntity entity;
-    if (constructorName != null) {
-      entity = constructorName;
-    } else {
-      var name = node.name;
-      if (name is PrefixedIdentifier) {
-        entity = name.identifier;
+
+    var data = _get(name);
+    if (name is SimpleIdentifier) {
+      name.staticElement = data.reference;
+      name.staticType = data.inferredType;
+      node.element = data.reference;
+    } else if (name is PrefixedIdentifier) {
+      if (data.prefixInfo != null) {
+        name.prefix.staticElement = data.prefixInfo;
+
+        data = _get(name.identifier);
+        name.identifier.staticElement = data.reference;
+        name.identifier.staticType = data.inferredType;
       } else {
-        entity = name;
+        name.prefix.staticElement = data.reference;
+        name.prefix.staticType = data.inferredType;
+        constructorName = name.identifier;
       }
     }
-    var data = _get(entity);
 
-    SimpleIdentifier topEntity;
-    if (data.prefixInfo != null) {
-      PrefixedIdentifier prefixedIdentifier = node.name;
-
-      SimpleIdentifier prefix = prefixedIdentifier.prefix;
-      prefix.staticElement = data.prefixInfo;
-
-      topEntity = prefixedIdentifier.identifier;
-    } else {
-      topEntity = node.name;
-    }
-
-    Element element = data.reference;
-    DartType type = data.inferredType;
-    node.element = element;
-
-    if (element is ConstructorElement) {
-      topEntity.staticElement = element.enclosingElement;
+    ArgumentList argumentList = node.arguments;
+    if (argumentList != null) {
+      var data = _get(argumentList);
+      ConstructorElement element = data.reference;
+      node.element = element;
 
       if (constructorName != null) {
         constructorName.staticElement = element;
         constructorName.staticType = element.type;
       }
 
-      ArgumentList argumentList = node.arguments;
-      if (argumentList != null) {
-        _applyResolutionToArguments(argumentList);
-        _resolveNamedArguments(argumentList, element.parameters);
-      }
-    } else {
-      topEntity.staticElement = element;
-      topEntity.staticType = type;
-      if (constructorName != null) {
-        constructorName.accept(this);
-        node.element = constructorName.staticElement;
-      }
+      _applyResolutionToArguments(argumentList);
+      _resolveNamedArguments(argumentList, element.parameters);
     }
   }
 
-  ResolutionData<DartType, Element, Element, PrefixElement> _get(
-      SyntacticEntity entity,
-      {bool failIfAbsent: true}) {
-    int entityOffset = entity.offset;
-    var data = _data[entityOffset];
-    if (failIfAbsent && data == null) {
-      throw new StateError('No data for $entity at $entityOffset');
-    }
-    return data;
-  }
-
   @override
   void visitAsExpression(AsExpression node) {
     node.expression.accept(this);
@@ -333,25 +307,6 @@
     _typeContext.exitLocalFunction(element);
   }
 
-  void _storeFunctionType(DartType type, FunctionElementImpl element) {
-    if (type is FunctionType && element != null) {
-      element.returnType = type.returnType;
-      int normalParameterIndex = 0;
-      int optionalParameterIndex = 0;
-      for (ParameterElementImpl parameter in element.parameters) {
-        if (parameter.isNamed) {
-          parameter.type = type.namedParameterTypes[parameter.name];
-        } else if (normalParameterIndex < type.normalParameterTypes.length) {
-          parameter.type = type.normalParameterTypes[normalParameterIndex++];
-        } else if (optionalParameterIndex <
-            type.optionalParameterTypes.length) {
-          parameter.type =
-              type.optionalParameterTypes[optionalParameterIndex++];
-        }
-      }
-    }
-  }
-
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.function.accept(this);
@@ -361,7 +316,7 @@
     node.staticInvokeType = invokeType;
 
     List<DartType> typeArguments = data.argumentTypes;
-    if (node.typeArguments != null && typeArguments is TypeArgumentsDartType) {
+    if (node.typeArguments != null && typeArguments != null) {
       _applyTypeArgumentsToList(
           _enclosingLibraryElement,
           new TypeArgumentsDartType(typeArguments),
@@ -395,14 +350,14 @@
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
-    ConstructorName constructorName = node.constructorName;
-    var data = _get(constructorName);
+    var data = _get(node.argumentList);
 
     PrefixElement prefix = data.prefixInfo;
 
     ConstructorElement constructor = data.reference;
     DartType type = data.inferredType;
 
+    ConstructorName constructorName = node.constructorName;
     applyConstructorElement(
         _enclosingLibraryElement, prefix, constructor, type, constructorName);
 
@@ -694,6 +649,17 @@
     }
   }
 
+  ResolutionData<DartType, Element, Element, PrefixElement> _get(
+      SyntacticEntity entity,
+      {bool failIfAbsent: true}) {
+    int entityOffset = entity.offset;
+    var data = _data[entityOffset];
+    if (failIfAbsent && data == null) {
+      throw new StateError('No data for $entity at $entityOffset');
+    }
+    return data;
+  }
+
   /// Return the [SyntacticEntity] with which the front-end associates
   /// assignment to the given [leftHandSide].
   SyntacticEntity _getAssignmentEntity(Expression leftHandSide) {
@@ -729,6 +695,25 @@
     }
   }
 
+  void _storeFunctionType(DartType type, FunctionElementImpl element) {
+    if (type is FunctionType && element != null) {
+      element.returnType = type.returnType;
+      int normalParameterIndex = 0;
+      int optionalParameterIndex = 0;
+      for (ParameterElementImpl parameter in element.parameters) {
+        if (parameter.isNamed) {
+          parameter.type = type.namedParameterTypes[parameter.name];
+        } else if (normalParameterIndex < type.normalParameterTypes.length) {
+          parameter.type = type.normalParameterTypes[normalParameterIndex++];
+        } else if (optionalParameterIndex <
+            type.optionalParameterTypes.length) {
+          parameter.type =
+              type.optionalParameterTypes[optionalParameterIndex++];
+        }
+      }
+    }
+  }
+
   /// Apply the [type] that is created by the [constructorName] and the
   /// [constructorElement] it references.
   static void applyConstructorElement(
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b470ac2..8cb4b47 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -3242,11 +3242,13 @@
       return;
     }
     // check for mixins
-    if (_enclosingClass.mixins.length != 0) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
-          constructor.returnType);
-      return;
+    for (var mixin in _enclosingClass.mixins) {
+      if (mixin.element.fields.isNotEmpty) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+            constructor.returnType);
+        return;
+      }
     }
     // try to find and check super constructor invocation
     for (ConstructorInitializer initializer in constructor.initializers) {
@@ -5726,35 +5728,63 @@
 
       var toType = expectedType;
       var fromType = expressionType;
-
-      if (isArrowFunction) {
-        if (_inAsync && toType.flattenFutures(_typeSystem).isVoid) {
-          return;
-        } else if (toType.isVoid) {
-          return;
-        }
+      if (_inAsync) {
+        toType = toType.flattenFutures(_typeSystem);
+        fromType = fromType.flattenFutures(_typeSystem);
       }
 
+      // Anything can be returned to `void` in an arrow bodied function
+      // or to `Future<void>` in an async arrow bodied function.
+      if (isArrowFunction && toType.isVoid) {
+        return;
+      }
+
+      // Anything can be returned to `dynamic`, or to `Future<dynamic>` in
+      // an async function.
       if (toType.isDynamic) {
         return;
       }
 
+      // Anything can be return to `Future<Null>` in an async function
+      if (_inAsync && toType.isDartCoreNull) {
+        return;
+      }
+
+      // If we're not in one of the `void` related special cases
+      // just check assignability.
+      if (!expectedType.isVoid && !fromType.isVoid) {
+        var checkWithType = (!_inAsync)
+            ? fromType
+            : _typeProvider.futureType.instantiate(<DartType>[fromType]);
+        if (_expressionIsAssignableAtType(
+            returnExpression, checkWithType, expectedType)) {
+          return;
+        }
+      }
+
+      // Void related special cases.  If the expression type flattens
+      // to `void`, and the expected type doesn't, then it's an error.
+      // Otherwise:
       if (toType.isVoid) {
-        if (fromType.isVoid) {
-          return;
-        }
-        if (!_inAsync && fromType.isDynamic ||
-            fromType.isDartCoreNull ||
-            fromType.isBottom) {
-          return;
-        }
-      } else if (!fromType.isVoid) {
-        if (_inAsync) {
-          fromType = _typeProvider.futureType
-              .instantiate(<DartType>[fromType.flattenFutures(_typeSystem)]);
-        }
-        if (_expressionIsAssignableAtType(returnExpression, fromType, toType)) {
-          return;
+        // In the case that the expected type is `void`
+        if (expectedType.isVoid) {
+          // Valid if the expression type is void, dynamic or Null
+          if (expressionType.isVoid ||
+              expressionType.isDynamic ||
+              expressionType.isDartCoreNull ||
+              expressionType.isBottom) {
+            return;
+          }
+        } else {
+          // The expected type is Future<void> or FutureOr<void>,
+          // and the return is valid if the expression type flattens
+          // to void, dynamic, or Null.
+          if (fromType.isVoid ||
+              fromType.isDynamic ||
+              fromType.isDartCoreNull ||
+              fromType.isBottom) {
+            return;
+          }
         }
       }
       reportTypeError();
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 51eead8..b180724 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -27,7 +27,8 @@
  */
 String formatList(String pattern, List<Object> arguments) {
   if (arguments == null || arguments.isEmpty) {
-    assert(!pattern.contains(new RegExp(r'\{(\d+)\}')));
+    assert(!pattern.contains(new RegExp(r'\{(\d+)\}')),
+        'Message requires arguments, but none were provided.');
     return pattern;
   }
   return pattern.replaceAllMapped(new RegExp(r'\{(\d+)\}'), (match) {
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index a500975..3158176 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer.src.generated.type_system;
-
 import 'dart:collection';
 import 'dart:math' as math;
 
@@ -15,8 +13,7 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/error/codes.dart'
-    show StrongModeCode, CompileTimeErrorCode;
+import 'package:analyzer/src/error/codes.dart' show StrongModeCode;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
diff --git a/pkg/analyzer/lib/src/kernel/resynthesize.dart b/pkg/analyzer/lib/src/kernel/resynthesize.dart
index 876f47d..a370739 100644
--- a/pkg/analyzer/lib/src/kernel/resynthesize.dart
+++ b/pkg/analyzer/lib/src/kernel/resynthesize.dart
@@ -260,7 +260,8 @@
   FunctionType _getFunctionType(
       ElementImpl context, kernel.FunctionType kernelType) {
     if (kernelType.typedef != null) {
-      return _getTypedefType(context, kernelType);
+      var translatedType = _getTypedefType(context, kernelType);
+      if (translatedType != null) return translatedType;
     }
 
     var element = new FunctionElementImpl('', -1);
@@ -329,51 +330,35 @@
 
     GenericTypeAliasElementImpl typedefElement =
         getElementFromCanonicalName(typedef.canonicalName);
-    GenericFunctionTypeElementImpl functionElement = typedefElement.function;
 
     kernel.FunctionType typedefType = typedef.type;
-    var kernelTypeParameters = typedef.typeParameters.toList();
-    kernelTypeParameters.addAll(typedefType.typeParameters);
 
-    // If no type parameters, the raw type of the element will do.
-    FunctionTypeImpl rawType = functionElement.type;
-    if (kernelTypeParameters.isEmpty) {
-      return rawType;
+    if (kernelType.typeParameters.length != typedefType.typeParameters.length) {
+      // Type parameters don't match; just resynthesize as a synthetic function
+      // type.
+      return null;
     }
 
-    // Compute type arguments for kernel type parameters.
-    var kernelMap = kernel.unifyTypes(typedefType.withoutTypeParameters,
-        kernelType.withoutTypeParameters, kernelTypeParameters.toSet());
-
-    // Prepare Analyzer type parameters, in the same order as kernel ones.
-    var astTypeParameters = typedefElement.typeParameters.toList();
-    astTypeParameters.addAll(functionElement.typeParameters);
+    // In the general case imagine the typedef is:
+    //     typedef F<T, U> = ... Function<V, W>(...);
+    // And kernelType is:
+    //     ... Function<X, Y>(...);
+    // So the outer type parameters of the typedef have been instantiated (or
+    // there were none); the inner type parameters have not been instantiated
+    // (or there were none).
+    //
+    // Now we have to figure out what substitution was used to instantiate
+    // the typedef, since the kernel doesn't track that information.
+    var substitution = kernel.unifyTypes(
+        typedefType, kernelType, typedef.typeParameters.toSet());
 
     // Convert kernel type arguments into Analyzer types.
-    int length = astTypeParameters.length;
-    var usedTypeParameters = <TypeParameterElement>[];
-    var usedTypeArguments = <DartType>[];
-    for (var i = 0; i < length; i++) {
-      var kernelParameter = kernelTypeParameters[i];
-      var kernelArgument = kernelMap[kernelParameter];
-      if (kernelArgument == null ||
-          kernelArgument is kernel.TypeParameterType &&
-              kernelArgument.parameter.parent == null) {
-        continue;
-      }
-      TypeParameterElement astParameter = astTypeParameters[i];
-      DartType astArgument = getType(context, kernelArgument);
-      usedTypeParameters.add(astParameter);
-      usedTypeArguments.add(astArgument);
-    }
-
-    if (usedTypeParameters.isEmpty) {
-      return rawType;
-    }
-
-    // Replace Analyzer type parameters with type arguments.
-    throw new UnimplementedError(
-        'TODO(paulberry): resynthesize generic typedef');
+    var typeArguments = typedef.typeParameters
+        .map((t) => substitution.containsKey(t)
+            ? getType(context, substitution[t])
+            : _typeProvider.nullType)
+        .toList();
+    return typedefElement.instantiate(typeArguments);
   }
 
   /// Return the [TypeParameterElement] for the given [kernelTypeParameter].
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 819219b..dddf70e 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.32.1
+version: 0.32.2
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
@@ -11,10 +11,10 @@
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.1
+  front_end: 0.1.2
   glob: ^1.0.3
   html: '>=0.12.0 <1.14.0'
-  kernel: 0.3.1
+  kernel: 0.3.2
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 6cd4ceb..171376f 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -149,6 +149,13 @@
 
   @failingTest
   @override
+  test_fieldTypeOk_generic() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib2::y in let ...
+    await super.test_fieldTypeOk_generic();
+  }
+
+  @failingTest
+  @override
   test_fieldTypeOk_unresolved_null() async {
     // UnimplementedError: kernel: (AsExpression) x as{TypeError} invalid-type
     await super.test_fieldTypeOk_unresolved_null();
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index 97fa300..f2a68eb 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -240,9 +240,16 @@
 
   @override
   @failingTest
-  test_constConstructorWithMixin() async {
-    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, found 0
-    await super.test_constConstructorWithMixin();
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33645')
+  test_constConstructorWithMixinWithField() async {
+    return super.test_constConstructorWithMixinWithField();
+  }
+
+  @override
+  @failingTest
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33645')
+  test_constConstructorWithMixinWithField_final() async {
+    return super.test_constConstructorWithMixinWithField_final();
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 6f250b2..0e0fd58 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -1026,15 +1026,33 @@
     verify([source]);
   }
 
-  test_constConstructorWithMixin() async {
+  test_constConstructorWithMixinWithField() async {
     Source source = addSource(r'''
-class M {
+class A {
+  var a;
 }
-class A extends Object with M {
-  const A();
+class B extends Object with A {
+  const B();
 }''');
     await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
+    ]);
+    verify([source]);
+  }
+
+  test_constConstructorWithMixinWithField_final() async {
+    Source source = addSource(r'''
+class A {
+  final int a = 0;
+}
+class B extends Object with A {
+  const B();
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD]);
     verify([source]);
   }
 
@@ -1076,7 +1094,7 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(source, [
-      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
       CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
     ]);
     verify([source]);
@@ -1617,6 +1635,27 @@
     verify([source]);
   }
 
+  test_constWithNonConst_in_const_context() async {
+    Source source = addSource(r'''
+class A {
+  const A(x);
+}
+class B {
+}
+main() {
+  const A(B());
+}
+''');
+    await computeAnalysisResult(source);
+    // TODO(a14n): the error CONST_WITH_NON_CONSTANT_ARGUMENT is redundant and
+    // ought to be suppressed.
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_WITH_NON_CONST,
+      CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT
+    ]);
+    verify([source]);
+  }
+
   test_constWithNonConst_with() async {
     Source source = addSource(r'''
 class B {
@@ -1639,27 +1678,6 @@
     verify([source]);
   }
 
-  test_constWithNonConst_in_const_context() async {
-    Source source = addSource(r'''
-class A {
-  const A(x);
-}
-class B {
-}
-main() {
-  const A(B());
-}
-''');
-    await computeAnalysisResult(source);
-    // TODO(a14n): the error CONST_WITH_NON_CONSTANT_ARGUMENT is redundant and
-    // ought to be suppressed.
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_WITH_NON_CONST,
-      CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT
-    ]);
-    verify([source]);
-  }
-
   test_constWithNonConstantArgument_annotation() async {
     Source source = addSource(r'''
 class A {
@@ -2749,6 +2767,98 @@
     verify([source]);
   }
 
+  test_genericFunctionTypeArgument_class() async {
+    Source source = addSource(r'''
+class C<T> {}
+C<T Function<T>(T)> c;''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_function() async {
+    Source source = addSource(r'''
+T f<T>(T) => null;
+main() { f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_functionType() async {
+    Source source = addSource(r'''
+T Function<T>(T) f;
+main() { f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_function() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+T f<T>(T) => null;
+main() { f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_functionType() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+T Function<T>(T) f;
+main() { f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_inference_method() async {
+    // TODO(mfairhurst) how should these inference errors be reported?
+    Source source = addSource(r'''
+class C {
+  T f<T>(T) => null;
+}
+main() { new C().f(<S>(S s) => s); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  test_genericFunctionTypeArgument_method() async {
+    Source source = addSource(r'''
+class C {
+  T f<T>(T) => null;
+}
+main() { new C().f<S Function<S>(S)>(null); }''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  @failingTest
+  test_genericFunctionTypeArgument_typedef() async {
+    // TODO(mfairhurst) diagnose these parse errors to give the correct error
+    Source source = addSource(r'''
+typedef T f<T>(T t);
+final T<Function<S>(int)> x = null;''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
   test_genericFunctionTypeAsBound_class() async {
     Source source = addSource(r'''
 class C<T extends S Function<S>(S)> {
@@ -7063,98 +7173,6 @@
     verify([source]);
   }
 
-  test_genericFunctionTypeArgument_class() async {
-    Source source = addSource(r'''
-class C<T> {}
-C<T Function<T>(T)> c;''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_functionType() async {
-    Source source = addSource(r'''
-T Function<T>(T) f;
-main() { f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_function() async {
-    Source source = addSource(r'''
-T f<T>(T) => null;
-main() { f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_method() async {
-    Source source = addSource(r'''
-class C {
-  T f<T>(T) => null;
-}
-main() { new C().f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_genericFunctionTypeArgument_inference_functionType() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
-    Source source = addSource(r'''
-T Function<T>(T) f;
-main() { f(<S>(S s) => s); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_genericFunctionTypeArgument_inference_function() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
-    Source source = addSource(r'''
-T f<T>(T) => null;
-main() { f(<S>(S s) => s); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_genericFunctionTypeArgument_inference_method() async {
-    // TODO(mfairhurst) how should these inference errors be reported?
-    Source source = addSource(r'''
-class C {
-  T f<T>(T) => null;
-}
-main() { new C().f(<S>(S s) => s); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_genericFunctionTypeArgument_typedef() async {
-    // TODO(mfairhurst) diagnose these parse errors to give the correct error
-    Source source = addSource(r'''
-typedef T f<T>(T t);
-final T<Function<S>(int)> x = null;''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
   test_undefinedAnnotation_unresolved_identifier() async {
     Source source = addSource(r'''
 @unresolved
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 85bd5a7..410dd7e 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -66,6 +66,41 @@
 
   @override
   @failingTest
+  test_multiple_ignores() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t2 = #lib2::x in let ...
+    await super.test_multiple_ignores();
+  }
+
+  @override
+  @failingTest
+  test_multiple_ignores_traling() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t3 = #lib3::x in let ...
+    await super.test_multiple_ignores_traling();
+  }
+
+  @override
+  @failingTest
+  test_multiple_ignores_whitespace_variant_1() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib4::x in let ...
+    await super.test_multiple_ignores_whitespace_variant_1();
+  }
+
+  @override
+  @failingTest
+  test_multiple_ignores_whitespace_variant_2() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t5 = #lib5::x in let ...
+    await super.test_multiple_ignores_whitespace_variant_2();
+  }
+
+  @override
+  @failingTest
+  test_multiple_ignores_whitespace_variant_3() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t6 = #lib6::x in let ...
+    await super.test_multiple_ignores_whitespace_variant_3();
+  }
+
+  @override
+  @failingTest
   test_no_ignores() async {
     // Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0;
     //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index 333ef36..ad843c2 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -12,11 +12,6 @@
   });
 }
 
-/// Tests marked with this annotation fail because of a Fasta problem.
-class FastaProblem {
-  const FastaProblem(String issueUri);
-}
-
 @reflectiveTest
 class HintCodeTest_Kernel extends HintCodeTest_Driver {
   @override
@@ -74,27 +69,6 @@
     return super.test_deadCode_deadFinalStatementInCase();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deadCode_statementAfterAlwaysThrowsFunction() async {
-    await super.test_deadCode_statementAfterAlwaysThrowsFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deadCode_statementAfterAlwaysThrowsMethod() async {
-    await super.test_deadCode_statementAfterAlwaysThrowsMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_assignment() async {
-    await super.test_deprecatedAnnotationUse_assignment();
-  }
-
   @failingTest
   @override
   test_deprecatedAnnotationUse_call() async {
@@ -102,13 +76,6 @@
     return super.test_deprecatedAnnotationUse_call();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_deprecated() async {
-    await super.test_deprecatedAnnotationUse_deprecated();
-  }
-
   @failingTest
   @override
   test_deprecatedAnnotationUse_Deprecated() async {
@@ -118,95 +85,16 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_export() async {
-    await super.test_deprecatedAnnotationUse_export();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_field() async {
-    await super.test_deprecatedAnnotationUse_field();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_getter() async {
-    await super.test_deprecatedAnnotationUse_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_import() async {
-    await super.test_deprecatedAnnotationUse_import();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_indexExpression() async {
-    await super.test_deprecatedAnnotationUse_indexExpression();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_instanceCreation() async {
-    await super.test_deprecatedAnnotationUse_instanceCreation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_instanceCreation_namedConstructor() async {
-    await super
-        .test_deprecatedAnnotationUse_instanceCreation_namedConstructor();
-  }
-
-  @override
-  @failingTest
   test_deprecatedAnnotationUse_named() async {
     return super.test_deprecatedAnnotationUse_named();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_operator() async {
-    await super.test_deprecatedAnnotationUse_operator();
-  }
-
   @failingTest
   @override
   test_deprecatedAnnotationUse_positional() async {
     return super.test_deprecatedAnnotationUse_positional();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_setter() async {
-    await super.test_deprecatedAnnotationUse_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_superConstructor() async {
-    await super.test_deprecatedAnnotationUse_superConstructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedAnnotationUse_superConstructor_namedConstructor() async {
-    await super
-        .test_deprecatedAnnotationUse_superConstructor_namedConstructor();
-  }
-
   @failingTest
   @override
   test_deprecatedFunction_class() async {
@@ -262,83 +150,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory__expr_return_null_OK() async {
-    await super.test_factory__expr_return_null_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_abstract_OK() async {
-    await super.test_factory_abstract_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_bad_return() async {
-    await super.test_factory_bad_return();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_block_OK() async {
-    await super.test_factory_block_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_block_return_null_OK() async {
-    await super.test_factory_block_return_null_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_expr_OK() async {
-    await super.test_factory_expr_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_misplaced_annotation() async {
-    await super.test_factory_misplaced_annotation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_no_return_type_OK() async {
-    await super.test_factory_no_return_type_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_subclass_OK() async {
-    await super.test_factory_subclass_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_factory_void_return() async {
-    await super.test_factory_void_return();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidImmutableAnnotation_method() async {
-    await super.test_invalidImmutableAnnotation_method();
-  }
-
-  @override
-  @failingTest
   test_invalidRequiredParam_on_named_parameter_with_default() async {
     return super.test_invalidRequiredParam_on_named_parameter_with_default();
   }
@@ -370,223 +181,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_closure() async {
-    await super.test_invalidUseOfProtectedMember_closure();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_field() async {
-    await super.test_invalidUseOfProtectedMember_field();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_field_OK() async {
-    await super.test_invalidUseOfProtectedMember_field_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_function() async {
-    await super.test_invalidUseOfProtectedMember_function();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_function_OK() async {
-    await super.test_invalidUseOfProtectedMember_function_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_function_OK2() async {
-    await super.test_invalidUseOfProtectedMember_function_OK2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_getter() async {
-    await super.test_invalidUseOfProtectedMember_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_getter_OK() async {
-    await super.test_invalidUseOfProtectedMember_getter_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_in_docs_OK() async {
-    await super.test_invalidUseOfProtectedMember_in_docs_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_message() async {
-    await super.test_invalidUseOfProtectedMember_message();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_method_1() async {
-    await super.test_invalidUseOfProtectedMember_method_1();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_method_OK() async {
-    await super.test_invalidUseOfProtectedMember_method_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_1() async {
-    await super.test_invalidUseOfProtectedMember_OK_1();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_2() async {
-    await super.test_invalidUseOfProtectedMember_OK_2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_3() async {
-    await super.test_invalidUseOfProtectedMember_OK_3();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_4() async {
-    await super.test_invalidUseOfProtectedMember_OK_4();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_field() async {
-    await super.test_invalidUseOfProtectedMember_OK_field();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_getter() async {
-    await super.test_invalidUseOfProtectedMember_OK_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_setter() async {
-    await super.test_invalidUseOfProtectedMember_OK_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_OK_setter_2() async {
-    await super.test_invalidUseOfProtectedMember_OK_setter_2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_setter() async {
-    await super.test_invalidUseOfProtectedMember_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_setter_OK() async {
-    await super.test_invalidUseOfProtectedMember_setter_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfProtectedMember_topLevelVariable() async {
-    await super.test_invalidUseOfProtectedMember_topLevelVariable();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_constructor() async {
-    await super.test_invalidUseOfVisibleForTestingMember_constructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_method() async {
-    await super.test_invalidUseOfVisibleForTestingMember_method();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_method_OK() async {
-    await super.test_invalidUseOfVisibleForTestingMember_method_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_OK_export() async {
-    await super.test_invalidUseOfVisibleForTestingMember_OK_export();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
-    await super.test_invalidUseOfVisibleForTestingMember_propertyAccess();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseOfVisibleForTestingMember_topLevelFunction() async {
-    await super.test_invalidUseOfVisibleForTestingMember_topLevelFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseProtectedAndForTesting_asProtected_OK() async {
-    await super.test_invalidUseProtectedAndForTesting_asProtected_OK();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidUseProtectedAndForTesting_asTesting_OK() async {
-    await super.test_invalidUseProtectedAndForTesting_asTesting_OK();
-  }
-
-  @override
-  @failingTest
   test_isNotDouble() {
     // Bad state: No data for is at 10
     return super.test_isNotDouble();
@@ -641,34 +235,6 @@
     return super.test_missingJsLibAnnotation_variable();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustBeImmutable_direct() async {
-    await super.test_mustBeImmutable_direct();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustBeImmutable_extends() async {
-    await super.test_mustBeImmutable_extends();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustBeImmutable_fromMixin() async {
-    await super.test_mustBeImmutable_fromMixin();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustBeImmutable_instance() async {
-    await super.test_mustBeImmutable_instance();
-  }
-
   @failingTest
   @override
   test_mustCallSuper() async {
@@ -676,13 +242,6 @@
     return super.test_mustCallSuper();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustCallSuper_fromInterface() async {
-    await super.test_mustCallSuper_fromInterface();
-  }
-
   @failingTest
   @override
   test_mustCallSuper_indirect() async {
@@ -690,27 +249,6 @@
     return super.test_mustCallSuper_indirect();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustCallSuper_overridden() async {
-    await super.test_mustCallSuper_overridden();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustCallSuper_overridden_w_future() async {
-    await super.test_mustCallSuper_overridden_w_future();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_mustCallSuper_overridden_w_future2() async {
-    await super.test_mustCallSuper_overridden_w_future2();
-  }
-
   @failingTest
   @override
   test_nullAwareBeforeOperator_ok_is_not() {
@@ -720,34 +258,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingField_invalid() async {
-    await super.test_overrideOnNonOverridingField_invalid();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingGetter_invalid() async {
-    await super.test_overrideOnNonOverridingGetter_invalid();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingMethod_invalid() async {
-    await super.test_overrideOnNonOverridingMethod_invalid();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingSetter_invalid() async {
-    await super.test_overrideOnNonOverridingSetter_invalid();
-  }
-
-  @override
-  @failingTest
   test_required_constructor_param() async {
     return super.test_required_constructor_param();
   }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index b080ee6..0195c61 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -26,6 +26,11 @@
   const FastaProblem(String issueUri);
 }
 
+/// Tests marked with this annotation fail because of an Analyzer problem.
+class AnalyzerProblem {
+  const AnalyzerProblem(String issueUri);
+}
+
 @reflectiveTest
 class NonErrorResolverTest_Kernel extends NonErrorResolverTest_Driver {
   @override
@@ -36,27 +41,13 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31625')
+  @AnalyzerProblem('https://github.com/dart-lang/sdk/issues/33636')
   test_ambiguousImport_showCombinator() async {
     return super.test_ambiguousImport_showCombinator();
   }
 
   @override
   @failingTest
-  test_argumentTypeNotAssignable_invocation_typedef_generic() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_argumentTypeNotAssignable_invocation_typedef_generic();
-  }
-
-  @override
-  @failingTest
-  test_argumentTypeNotAssignable_optionalNew() {
-    // Bad state: No data for (builder: () {return Widget();}) at 164
-    return super.test_argumentTypeNotAssignable_optionalNew();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31604')
   test_commentReference_beforeConstructor() async {
     return super.test_commentReference_beforeConstructor();
@@ -127,13 +118,6 @@
 
   @override
   @failingTest
-  test_const_dynamic() {
-    // UnimplementedError: TODO(paulberry): DynamicType
-    return super.test_const_dynamic();
-  }
-
-  @override
-  @failingTest
   @potentialAnalyzerProblem
   test_constConstructorWithNonConstSuper_unresolved() async {
     return super.test_constConstructorWithNonConstSuper_unresolved();
@@ -142,13 +126,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_constConstructorWithNonFinalField_mixin() async {
-    return super.test_constConstructorWithNonFinalField_mixin();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_constDeferredClass_new() async {
     return super.test_constDeferredClass_new();
   }
@@ -169,13 +146,6 @@
 
   @override
   @failingTest
-  test_dynamicIdentifier() {
-    // UnimplementedError: TODO(paulberry): DynamicType
-    return super.test_dynamicIdentifier();
-  }
-
-  @override
-  @failingTest
   test_fieldFormalParameter_genericFunctionTyped() {
     // Expected 0 errors of type ParserErrorCode.EXPECTED_TOKEN, found 1 (88)
     return super.test_fieldFormalParameter_genericFunctionTyped();
@@ -216,64 +186,6 @@
     return super.test_functionTypeAlias_scope_signature();
   }
 
-  @override
-  @failingTest
-  test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters();
-  }
-
-  @override
-  @failingTest
-  test_genericTypeAlias_castsAndTypeChecks_noTypeParameters() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_genericTypeAlias_castsAndTypeChecks_noTypeParameters();
-  }
-
-  @override
-  @failingTest
-  test_genericTypeAlias_fieldAndReturnType_noTypeParameters() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_genericTypeAlias_fieldAndReturnType_noTypeParameters();
-  }
-
-  @override
-  @failingTest
-  test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super
-        .test_genericTypeAlias_fieldAndReturnType_typeParameters_arguments();
-  }
-
-  @override
-  @failingTest
-  test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super
-        .test_genericTypeAlias_fieldAndReturnType_typeParameters_noArguments();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_genericTypeAlias_invalidGenericFunctionType() async {
-    return super.test_genericTypeAlias_invalidGenericFunctionType();
-  }
-
-  @override
-  @failingTest
-  test_genericTypeAlias_noTypeParameters() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_genericTypeAlias_noTypeParameters();
-  }
-
-  @override
-  @failingTest
-  test_genericTypeAlias_typeParameters() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_genericTypeAlias_typeParameters();
-  }
-
   @override // passes with kernel
   test_infer_mixin() => super.test_infer_mixin();
 
@@ -283,20 +195,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_instance_creation_inside_annotation() async {
-    return super.test_instance_creation_inside_annotation();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_integerLiteralOutOfRange_negative_valid() async {
-    return super.test_integerLiteralOutOfRange_negative_valid();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31641')
   test_invalidAnnotation_constantVariable_field() async {
     return super.test_invalidAnnotation_constantVariable_field();
@@ -313,45 +211,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_invalidAnnotation_constantVariable_topLevel() async {
-    return super.test_invalidAnnotation_constantVariable_topLevel();
-  }
-
-  @override
-  @failingTest
-  test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
-    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
-    // of 'topEntity'
-    return super
-        .test_invalidAnnotation_constantVariable_topLevel_importWithPrefix();
-  }
-
-  @override
-  @failingTest
-  test_invalidAnnotation_constConstructor_importWithPrefix() {
-    // type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
-    // of 'topEntity'
-    return super.test_invalidAnnotation_constConstructor_importWithPrefix();
-  }
-
-  @override
-  @failingTest
-  test_invalidAnnotation_constConstructor_named_importWithPrefix() {
-    // Bad state: No data for named at 29
-    return super
-        .test_invalidAnnotation_constConstructor_named_importWithPrefix();
-  }
-
-  @override
-  @failingTest
-  test_invocationOfNonFunction_functionTypeTypeParameter() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_invocationOfNonFunction_functionTypeTypeParameter();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31758')
   test_invocationOfNonFunction_Object() async {
     return super.test_invocationOfNonFunction_Object();
@@ -437,13 +296,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_staticAccessToInstanceMember_annotation() async {
-    return super.test_staticAccessToInstanceMember_annotation();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_static_conditionalAccess() {
     // Bad state: No data for A at 36
     return super.test_undefinedGetter_static_conditionalAccess();
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 6a12526..efa9d7a 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1314,6 +1314,18 @@
     verify([source]);
   }
 
+  test_constConstructorWithMixinWithField() async {
+    Source source = addSource(r'''
+class M {
+}
+class A extends Object with M {
+  const A();
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_constConstructorWithNonConstSuper_explicit() async {
     Source source = addSource(r'''
 class A {
@@ -1368,19 +1380,6 @@
     verify([source]);
   }
 
-  test_constConstructorWithNonFinalField_mixin() async {
-    Source source = addSource(r'''
-class A {
-  a() {}
-}
-class B extends Object with A {
-  const B();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
-    verify([source]);
-  }
-
   test_constConstructorWithNonFinalField_static() async {
     Source source = addSource(r'''
 class A {
@@ -2907,6 +2906,12 @@
     assertNoErrors(source);
   }
 
+  test_integerLiteralOutOfRange_negative_small() async {
+    Source source = addSource('int x = -42;');
+    await computeAnalysisResult(source);
+    assertErrors(source);
+  }
+
   test_integerLiteralOutOfRange_negative_valid() async {
     Source source = addSource('int x = -9223372036854775808;');
     await computeAnalysisResult(source);
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index b3fe456..f8e4ba4 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -71,20 +71,6 @@
         .test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedMemberUse_inDeprecatedClass() async {
-    await super.test_deprecatedMemberUse_inDeprecatedClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedMemberUse_inDeprecatedFunction() async {
-    await super.test_deprecatedMemberUse_inDeprecatedFunction();
-  }
-
   @failingTest
   @override
   @potentialAnalyzerProblem
@@ -96,27 +82,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedMemberUse_inDeprecatedMethod() async {
-    await super.test_deprecatedMemberUse_inDeprecatedMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass() async {
-    await super.test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_missingReturn_alwaysThrows() async {
-    await super.test_missingReturn_alwaysThrows();
-  }
-
-  @override
-  @failingTest
   test_overrideOnNonOverridingField_inInterface() {
     // Expected 1 errors of type
     // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
@@ -133,76 +98,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingGetter_inInterface() async {
-    await super.test_overrideOnNonOverridingGetter_inInterface();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingGetter_inSuperclass() async {
-    await super.test_overrideOnNonOverridingGetter_inSuperclass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingMethod_inInterface() async {
-    await super.test_overrideOnNonOverridingMethod_inInterface();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingMethod_inSuperclass() async {
-    await super.test_overrideOnNonOverridingMethod_inSuperclass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingMethod_inSuperclass_abstract() async {
-    await super.test_overrideOnNonOverridingMethod_inSuperclass_abstract();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingSetter_inInterface() async {
-    await super.test_overrideOnNonOverridingSetter_inInterface();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_overrideOnNonOverridingSetter_inSuperclass() async {
-    await super.test_overrideOnNonOverridingSetter_inSuperclass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_proxy_annotation_prefixed() async {
-    await super.test_proxy_annotation_prefixed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_proxy_annotation_prefixed2() async {
-    await super.test_proxy_annotation_prefixed2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_proxy_annotation_prefixed3() async {
-    await super.test_proxy_annotation_prefixed3();
-  }
-
-  @override
-  @failingTest
   @notForDart2
   test_undefinedOperator_binaryExpression_inSubtype() async {
     await super.test_undefinedOperator_binaryExpression_inSubtype();
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 3c85986..18d1d5a 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -4451,16 +4451,11 @@
     // It doesn't try to advance past the invalid token `!` to find the
     // valid `>`. If it did we'd get less cascading errors, at least for this
     // particular example.
-    createParser('void m<E, hello!>() {}', expectedEndOffset: 6);
+    createParser('void m<E, hello!>() {}');
     ClassMember member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
     listener.assertErrors(usingFastaParser
-        ? [
-            // TODO(danrubel): Improve recovery
-            expectedError(
-                ParserErrorCode.MISSING_METHOD_PARAMETERS, 5, 1) /*<*/,
-            expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 6, 1) /*E*/
-          ]
+        ? [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 15, 1)]
         : [
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 0) /*>*/,
             expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 0),
@@ -4470,10 +4465,8 @@
           ]);
     expect(member, new isInstanceOf<MethodDeclaration>());
     MethodDeclaration method = member;
-    if (!usingFastaParser) {
-      expect(method.typeParameters.toString(), '<E, hello>',
-          reason: 'parser recovers what it can');
-    }
+    expect(method.typeParameters.toString(), '<E, hello>',
+        reason: 'parser recovers what it can');
   }
 
   void test_missingAssignableSelector_identifiersAssigned() {
@@ -6758,6 +6751,17 @@
     expect(literal.typeArguments, isNotNull);
   }
 
+  void test_parseConstExpression_mapLiteral_typed_missingGt() {
+    Expression expression = parseExpression('const <A, B {}',
+        errors: [expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 1)]);
+    expect(expression, isNotNull);
+    var literal = expression as MapLiteral;
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+    expect(literal.typeArguments, isNotNull);
+  }
+
   void test_parseConstExpression_mapLiteral_typed_genericComment() {
     enableGenericMethodComments = true;
     Expression expression = parseConstExpression('const /*<A, B>*/ {}');
@@ -6836,6 +6840,17 @@
     expect(binaryExpression.rightOperand, isNotNull);
   }
 
+  void test_parseExpression_constAndTypeParameters() {
+    Expression expression = parseExpression('const <E>',
+        codes: usingFastaParser
+            ? [
+                // TODO(danrubel): Improve this error message.
+                ParserErrorCode.EXPECTED_TOKEN
+              ]
+            : [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
+    expect(expression, isNotNull);
+  }
+
   void test_parseExpression_function_async() {
     Expression expression = parseExpression('() async {}');
     var functionExpression = expression as FunctionExpression;
@@ -7022,6 +7037,46 @@
     expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
   }
 
+  void test_parseFunctionExpression_functionInPlaceOfTypeName() {
+    Expression expression = parseExpression('<test(' ', (){});>[0, 1, 2]',
+        codes: usingFastaParser
+            ? [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.UNEXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_FUNCTION_BODY,
+              ]
+            : [
+                ParserErrorCode.EXPECTED_TOKEN,
+                ParserErrorCode.MISSING_IDENTIFIER,
+                ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL,
+              ]);
+    expect(expression, isNotNull);
+  }
+
+  void test_parseFunctionExpression_constAndTypeParameters2() {
+    FunctionExpression expression =
+        parseFunctionExpression('const <E>(E i) => i++');
+    expect(expression, isNotNull);
+    assertErrorsWithCodes(usingFastaParser
+        ? [ParserErrorCode.UNEXPECTED_TOKEN]
+        : [
+            ParserErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.MISSING_IDENTIFIER,
+            ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR,
+            ParserErrorCode.MISSING_CLOSING_PARENTHESIS,
+          ]);
+    expect(expression.body, isNotNull);
+    if (usingFastaParser) {
+      expect(expression.typeParameters, isNotNull);
+      expect(expression.parameters, isNotNull);
+      expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
+    }
+  }
+
   void test_parseFunctionExpression_typeParameterComments() {
     enableGenericMethodComments = true;
     FunctionExpression expression =
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index b0bd5c2..a493d63 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -64,13 +64,6 @@
 
   @override
   @failingTest
-  test_bug21912() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_bug21912();
-  }
-
-  @override
-  @failingTest
   test_expectedOneListTypeArgument() async {
     // Bad state: Found 1 argument types for 2 type arguments
     await super.test_expectedOneListTypeArgument();
@@ -261,16 +254,23 @@
 
   @override
   @failingTest
-  test_invalidAssignment_dynamic() async {
-    // Bad state: No reference information for dynamic at 11
-    await super.test_invalidAssignment_dynamic();
+  test_invalidAssignment_defaultValue_named() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t1 = 0 in let ...
+    await super.test_invalidAssignment_defaultValue_named();
   }
 
   @override
   @failingTest
-  test_invocationOfNonFunction_class() async {
-    // Expected 1 errors of type StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, found 0
-    await super.test_invocationOfNonFunction_class();
+  test_invalidAssignment_defaultValue_optional() async {
+    // UnimplementedError: kernel: (Let) let final dynamic #t2 = 0 in let ...
+    await super.test_invalidAssignment_defaultValue_optional();
+  }
+
+  @override
+  @failingTest
+  test_invalidAssignment_dynamic() async {
+    // Bad state: No reference information for dynamic at 11
+    await super.test_invalidAssignment_dynamic();
   }
 
   @override
@@ -705,13 +705,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_undefinedGetter_proxy_annotation_fakeProxy() async {
-    await super.test_undefinedGetter_proxy_annotation_fakeProxy();
-  }
-
-  @override
-  @failingTest
   test_undefinedGetter_static() async {
     // Bad state: No reference information for A at 19
     await super.test_undefinedGetter_static();
@@ -803,13 +796,6 @@
 
   @override
   @failingTest
-  test_undefinedMethodWithConstructor() async {
-    // Bad state: No reference information for C at 35
-    await super.test_undefinedMethodWithConstructor();
-  }
-
-  @override
-  @failingTest
   test_undefinedOperator_indexBoth() async {
     // Expected 1 errors of type StaticTypeWarningCode.UNDEFINED_OPERATOR, found 0
     await super.test_undefinedOperator_indexBoth();
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 0e94294..8f9548d 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -65,13 +65,6 @@
 
   @override
   @failingTest
-  test_constrainedByBounds4() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_constrainedByBounds4();
-  }
-
-  @override
-  @failingTest
   test_constrainedByBounds5() async {
     // Bad state: Expected a type for 4 at 119; got one for kernel offset 118
     await super.test_constrainedByBounds5();
@@ -107,41 +100,6 @@
 
   @override
   @failingTest
-  test_functionDeclaration_body_propagation() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_functionDeclaration_body_propagation();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_assignment_typedArguments() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_functionLiteral_assignment_typedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_assignment_unTypedArguments() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_functionLiteral_assignment_unTypedArguments();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_body_propagation() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_functionLiteral_body_propagation();
-  }
-
-  @override
-  @failingTest
-  test_functionLiteral_unTypedArgument_propagation() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_functionLiteral_unTypedArgument_propagation();
-  }
-
-  @override
-  @failingTest
   test_futureOr_downwards8() async {
     // type 'BottomTypeImpl' is not a subtype of type 'InterfaceType' in type cast where
     await super.test_futureOr_downwards8();
@@ -273,13 +231,6 @@
 
   @override
   @failingTest
-  test_partialTypes1() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_partialTypes1();
-  }
-
-  @override
-  @failingTest
   test_pinning_multipleConstraints1() async {
     // Expected 1 errors of type StrongModeCode.STRONG_MODE_INVALID_CAST_LITERAL, found 0
     await super.test_pinning_multipleConstraints1();
@@ -294,34 +245,6 @@
 
   @override
   @failingTest
-  test_pinning_multipleConstraints_contravariant1() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_pinning_multipleConstraints_contravariant1();
-  }
-
-  @override
-  @failingTest
-  test_pinning_multipleConstraints_contravariant2() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_pinning_multipleConstraints_contravariant2();
-  }
-
-  @override
-  @failingTest
-  test_pinning_multipleConstraints_contravariant3() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_pinning_multipleConstraints_contravariant3();
-  }
-
-  @override
-  @failingTest
-  test_pinning_multipleConstraints_contravariant4() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_pinning_multipleConstraints_contravariant4();
-  }
-
-  @override
-  @failingTest
   test_redirectedConstructor_named() {
     // Expected: 'A<T2, U2>'; Actual: 'A<T, U>'
     return super.test_redirectedConstructor_named();
@@ -342,48 +265,6 @@
     // TODO(brianwilkerson) Figure out why this test is flaky.
     fail('Flaky test');
   }
-
-  @override
-  @failingTest
-  test_returnType_variance1() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_returnType_variance1();
-  }
-
-  @override
-  @failingTest
-  test_returnType_variance2() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_returnType_variance2();
-  }
-
-  @override
-  @failingTest
-  test_returnType_variance3() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_returnType_variance3();
-  }
-
-  @override
-  @failingTest
-  test_returnType_variance4() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_returnType_variance4();
-  }
-
-  @override
-  @failingTest
-  test_returnType_variance5() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_returnType_variance5();
-  }
-
-  @override
-  @failingTest
-  test_returnType_variance6() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_returnType_variance6();
-  }
 }
 
 @reflectiveTest
@@ -413,13 +294,6 @@
 
   @override
   @failingTest
-  test_genericFunction_typedef() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_genericFunction_typedef();
-  }
-
-  @override
-  @failingTest
   test_genericMethod_explicitTypeParams() async {
     // Bad state: Found 2 argument types for 1 type arguments
     await super.test_genericMethod_explicitTypeParams();
@@ -573,13 +447,6 @@
 
   @override
   @failingTest
-  test_instantiateToBounds_class_error_typedef() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_instantiateToBounds_class_error_typedef();
-  }
-
-  @override
-  @failingTest
   test_notInstantiatedBound_class_error_recursion_typedef() {
     // Expected 2 errors of type
     // StrongModeCode.STRONG_MODE_NOT_INSTANTIATED_BOUND, found 0; 1 errors of
@@ -653,13 +520,6 @@
 
   @override
   @failingTest
-  test_objectMethodOnFunctions_Typedef() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super.test_objectMethodOnFunctions_Typedef();
-  }
-
-  @override
-  @failingTest
   test_returnOfInvalidType_object_void() async {
     await super.test_returnOfInvalidType_object_void();
   }
@@ -697,12 +557,4 @@
 
   @override
   bool get useCFE => true;
-
-  @override
-  @failingTest
-  test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef() {
-    // UnimplementedError: TODO(paulberry): resynthesize generic typedef
-    return super
-        .test_inconsistentMethodInheritance_inferFunctionTypeFromTypedef();
-  }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index 4bb1b75..5494d3e 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -31,6 +31,8 @@
   @override
   bool get useCFE => true;
 
+//  @failingTest
+//  @potentialAnalyzerProblem
   @override
   test_asyncChangesDuringAnalysis_getErrors() async {
     // TODO(brianwilkerson) Re-enable this test. It was disabled because it
@@ -54,7 +56,7 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
+  @FastaProblem('https://github.com/dart-lang/sdk/issues/33642')
   test_const_annotation_notConstConstructor() async {
     await super.test_const_annotation_notConstConstructor();
   }
@@ -66,27 +68,6 @@
     await super.test_const_annotation_withArgs();
   }
 
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_annotation_withoutArgs() async {
-    await super.test_const_annotation_withoutArgs();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_circular_reference() async {
-    await super.test_const_circular_reference();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_dependency_sameUnit() async {
-    await super.test_const_dependency_sameUnit();
-  }
-
   @failingTest
   @potentialAnalyzerProblem
   @override
@@ -94,13 +75,6 @@
     await super.test_const_externalConstFactory();
   }
 
-  @override
-  @failingTest
-  test_const_implicitCreation() {
-    // Bad state: No data for () at 69
-    return super.test_const_implicitCreation();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31555')
   @override
@@ -108,13 +82,6 @@
     await super.test_const_implicitSuperConstructorInvocation();
   }
 
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_const_simple_topLevelVariable() async {
-    await super.test_const_simple_topLevelVariable();
-  }
-
   @failingTest
   @potentialAnalyzerProblem
   @override
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index ce897ed..c912d36 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -23,43 +23,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_annotation() async {
-    await super.test_annotation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_annotation_constructor_withNestedConstructorInvocation() async {
-    await super.test_annotation_constructor_withNestedConstructorInvocation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_annotation_kind_reference() async {
-    await super.test_annotation_kind_reference();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_annotation_prefixed_classConstructor() {
-    // TODO(paulberry): broken because prefixes are not working properly
-    return super.test_annotation_prefixed_classConstructor();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_annotation_prefixed_classConstructorNamed() {
-    // TODO(paulberry): broken because prefixes are not working properly
-    return super.test_annotation_prefixed_classConstructorNamed();
-  }
-
-  @override
-  @failingTest
   @potentialAnalyzerProblem
   test_annotation_prefixed_classField() {
     // TODO(paulberry): broken because prefixes are not working properly
@@ -68,14 +31,6 @@
 
   @override
   @failingTest
-  @potentialAnalyzerProblem
-  test_annotation_prefixed_topLevelVariable() {
-    // TODO(paulberry): broken because prefixes are not working properly
-    return super.test_annotation_prefixed_topLevelVariable();
-  }
-
-  @override
-  @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/31605')
   test_constructor_redirected_generic() async {
     await super.test_constructor_redirected_generic();
@@ -84,14 +39,6 @@
   @override
   @failingTest
   @potentialAnalyzerProblem
-  test_functionExpressionInvocation() {
-    // TODO(paulberry): broken because of in-progress FunctionTypeImpl rework
-    return super.test_functionExpressionInvocation();
-  }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
   test_instanceCreation_prefixed() {
     // TODO(paulberry): broken because prefixes are not working properly
     return super.test_instanceCreation_prefixed();
@@ -114,14 +61,6 @@
     // parameters from the kernel representation.
     return super.test_local_function_generic();
   }
-
-  @override
-  @failingTest
-  @potentialAnalyzerProblem
-  test_type_functionTypeAlias() {
-    // TODO(paulberry): broken because of in-progress FunctionTypeImpl rework
-    return super.test_type_functionTypeAlias();
-  }
 }
 
 /// Tests marked with this annotation fail because of a Fasta problem.
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index dc7cb05..033035c 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -128,77 +128,48 @@
     }
   }
 
-  test_annotation_constructor_withNestedConstructorInvocation() async {
-    addTestFile('''
-class C {
-  const C();
+  test_annotation_prefixed_classField() async {
+    var a = _p('/test/lib/a.dart');
+    provider.newFile(a, r'''
+class A {
+  static const a = 1;
 }
-class D {
-  final C c;
-  const D(this.c);
-}
-@D(const C())
-f() {}
 ''');
-    var result = await driver.getResult(testFile);
-    var elementC = AstFinder.getClass(result.unit, 'C').element;
-    var constructorC = elementC.constructors[0];
-    var elementD = AstFinder.getClass(result.unit, 'D').element;
-    var constructorD = elementD.constructors[0];
-    var atD = AstFinder.getTopLevelFunction(result.unit, 'f').metadata[0];
-    InstanceCreationExpression constC = atD.arguments.arguments[0];
+    addTestFile(r'''
+import 'a.dart' as p;
 
-    expect(atD.name.staticElement, elementD);
-    expect(atD.element, constructorD);
-
-    expect(constC.staticElement, constructorC);
-    expect(constC.staticType, elementC.type);
-
-    expect(constC.constructorName.staticElement, constructorC);
-    expect(constC.constructorName.type.type, elementC.type);
-  }
-
-  test_annotation_kind_reference() async {
-    String content = r'''
-const annotation_1 = 1;
-const annotation_2 = 1;
-@annotation_1
-@annotation_2
-void main() {
-  print(42);
-}
-''';
-    addTestFile(content);
-
+@p.A.a
+main() {}
+''');
     AnalysisResult result = await driver.getResult(testFile);
-    var typeProvider = result.unit.element.context.typeProvider;
+    CompilationUnit unit = result.unit;
+    var typeProvider = unit.element.context.typeProvider;
 
-    TopLevelVariableDeclaration declaration_1 = result.unit.declarations[0];
-    VariableDeclaration variable_1 = declaration_1.variables.variables[0];
-    TopLevelVariableElement element_1 = variable_1.element;
+    ImportElement aImport = unit.element.library.imports[0];
+    PrefixElement aPrefix = aImport.prefix;
+    LibraryElement aLibrary = aImport.importedLibrary;
 
-    TopLevelVariableDeclaration declaration_2 = result.unit.declarations[1];
-    VariableDeclaration variable_2 = declaration_2.variables.variables[0];
-    TopLevelVariableElement element_2 = variable_2.element;
+    CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
+    ClassElement aClass = aUnitElement.getType('A');
+    var aGetter = aClass.getField('a').getter;
 
-    FunctionDeclaration main = result.unit.declarations[2];
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(aGetter));
+    PrefixedIdentifier prefixed = annotation.name;
 
-    Annotation annotation_1 = main.metadata[0];
-    expect(annotation_1.element, same(element_1.getter));
+    expect(prefixed.prefix.staticElement, same(aPrefix));
+    expect(prefixed.prefix.staticType, isNull);
 
-    SimpleIdentifier identifier_1 = annotation_1.name;
-    expect(identifier_1.staticElement, same(element_1.getter));
-    expect(identifier_1.staticType, typeProvider.intType);
+    expect(prefixed.identifier.staticElement, same(aClass));
+    expect(prefixed.prefix.staticType, isNull);
 
-    Annotation annotation_2 = main.metadata[1];
-    expect(annotation_2.element, same(element_2.getter));
+    expect(annotation.constructorName.staticElement, aGetter);
+    expect(annotation.constructorName.staticType, typeProvider.intType);
 
-    SimpleIdentifier identifier_2 = annotation_2.name;
-    expect(identifier_2.staticElement, same(element_2.getter));
-    expect(identifier_2.staticType, typeProvider.intType);
+    expect(annotation.arguments, isNull);
   }
 
-  test_annotation_prefixed_classConstructor() async {
+  test_annotation_prefixed_constructor() async {
     var a = _p('/test/lib/a.dart');
     provider.newFile(a, r'''
 class A {
@@ -240,7 +211,7 @@
     _assertArgumentToParameter(arguments[1], parameters[1]);
   }
 
-  test_annotation_prefixed_classConstructorNamed() async {
+  test_annotation_prefixed_constructor_named() async {
     var a = _p('/test/lib/a.dart');
     provider.newFile(a, r'''
 class A {
@@ -284,47 +255,6 @@
     _assertArgumentToParameter(arguments[1], parameters[1]);
   }
 
-  test_annotation_prefixed_classField() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
-class A {
-  static const a = 1;
-}
-''');
-    addTestFile(r'''
-import 'a.dart' as p;
-
-@p.A.a
-main() {}
-''');
-    AnalysisResult result = await driver.getResult(testFile);
-    CompilationUnit unit = result.unit;
-    var typeProvider = unit.element.context.typeProvider;
-
-    ImportElement aImport = unit.element.library.imports[0];
-    PrefixElement aPrefix = aImport.prefix;
-    LibraryElement aLibrary = aImport.importedLibrary;
-
-    CompilationUnitElement aUnitElement = aLibrary.definingCompilationUnit;
-    ClassElement aClass = aUnitElement.getType('A');
-    var aGetter = aClass.getField('a').getter;
-
-    Annotation annotation = unit.declarations[0].metadata.single;
-    expect(annotation.element, same(aGetter));
-    PrefixedIdentifier prefixed = annotation.name;
-
-    expect(prefixed.prefix.staticElement, same(aPrefix));
-    expect(prefixed.prefix.staticType, isNull);
-
-    expect(prefixed.identifier.staticElement, same(aClass));
-    expect(prefixed.prefix.staticType, isNull);
-
-    expect(annotation.constructorName.staticElement, aGetter);
-    expect(annotation.constructorName.staticType, typeProvider.intType);
-
-    expect(annotation.arguments, isNull);
-  }
-
   test_annotation_prefixed_topLevelVariable() async {
     var a = _p('/test/lib/a.dart');
     provider.newFile(a, r'''
@@ -360,6 +290,140 @@
     expect(annotation.arguments, isNull);
   }
 
+  test_annotation_unprefixed_constructor() async {
+    addTestFile(r'''
+@A(1, b: 2)
+main() {}
+
+class A {
+  const A(int a, {int b});
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    CompilationUnitElement unitElement = unit.element;
+
+    ClassElement aClass = unitElement.getType('A');
+    ConstructorElement constructor = aClass.unnamedConstructor;
+
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(constructor));
+
+    SimpleIdentifier name = annotation.name;
+    expect(name.staticElement, same(aClass));
+
+    expect(annotation.constructorName, isNull);
+
+    var arguments = annotation.arguments.arguments;
+    var parameters = constructor.parameters;
+    _assertArgumentToParameter(arguments[0], parameters[0]);
+    _assertArgumentToParameter(arguments[1], parameters[1]);
+  }
+
+  test_annotation_unprefixed_constructor_named() async {
+    addTestFile(r'''
+@A.named(1, b: 2)
+main() {}
+
+class A {
+  const A.named(int a, {int b});
+}
+''');
+    AnalysisResult result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    CompilationUnitElement unitElement = unit.element;
+
+    ClassElement aClass = unitElement.getType('A');
+    ConstructorElement constructor = aClass.constructors.single;
+
+    Annotation annotation = unit.declarations[0].metadata.single;
+    expect(annotation.element, same(constructor));
+    PrefixedIdentifier prefixed = annotation.name;
+
+    expect(prefixed.prefix.staticElement, same(aClass));
+    expect(prefixed.prefix.staticType, aClass.type);
+
+    expect(prefixed.identifier.staticElement, same(constructor));
+    expect(prefixed.identifier.staticType.toString(), '(int, {b: int}) → A');
+
+    expect(annotation.constructorName, isNull);
+
+    var arguments = annotation.arguments.arguments;
+    var parameters = constructor.parameters;
+    _assertArgumentToParameter(arguments[0], parameters[0]);
+    _assertArgumentToParameter(arguments[1], parameters[1]);
+  }
+
+  test_annotation_unprefixed_constructor_withNestedConstructorInvocation() async {
+    addTestFile('''
+class C {
+  const C();
+}
+class D {
+  final C c;
+  const D(this.c);
+}
+@D(const C())
+f() {}
+''');
+    var result = await driver.getResult(testFile);
+    var elementC = AstFinder.getClass(result.unit, 'C').element;
+    var constructorC = elementC.constructors[0];
+    var elementD = AstFinder.getClass(result.unit, 'D').element;
+    var constructorD = elementD.constructors[0];
+    var atD = AstFinder.getTopLevelFunction(result.unit, 'f').metadata[0];
+    InstanceCreationExpression constC = atD.arguments.arguments[0];
+
+    expect(atD.name.staticElement, elementD);
+    expect(atD.element, constructorD);
+
+    expect(constC.staticElement, constructorC);
+    expect(constC.staticType, elementC.type);
+
+    expect(constC.constructorName.staticElement, constructorC);
+    expect(constC.constructorName.type.type, elementC.type);
+  }
+
+  test_annotation_unprefixed_topLevelVariable() async {
+    String content = r'''
+const annotation_1 = 1;
+const annotation_2 = 1;
+@annotation_1
+@annotation_2
+void main() {
+  print(42);
+}
+''';
+    addTestFile(content);
+
+    AnalysisResult result = await driver.getResult(testFile);
+    var typeProvider = result.unit.element.context.typeProvider;
+
+    TopLevelVariableDeclaration declaration_1 = result.unit.declarations[0];
+    VariableDeclaration variable_1 = declaration_1.variables.variables[0];
+    TopLevelVariableElement element_1 = variable_1.element;
+
+    TopLevelVariableDeclaration declaration_2 = result.unit.declarations[1];
+    VariableDeclaration variable_2 = declaration_2.variables.variables[0];
+    TopLevelVariableElement element_2 = variable_2.element;
+
+    FunctionDeclaration main = result.unit.declarations[2];
+
+    Annotation annotation_1 = main.metadata[0];
+    expect(annotation_1.element, same(element_1.getter));
+
+    SimpleIdentifier identifier_1 = annotation_1.name;
+    expect(identifier_1.staticElement, same(element_1.getter));
+    expect(identifier_1.staticType, typeProvider.intType);
+
+    Annotation annotation_2 = main.metadata[1];
+    expect(annotation_2.element, same(element_2.getter));
+
+    SimpleIdentifier identifier_2 = annotation_2.name;
+    expect(identifier_2.staticElement, same(element_2.getter));
+    expect(identifier_2.staticType, typeProvider.intType);
+  }
+
   test_asExpression() async {
     String content = r'''
 void main() {
diff --git a/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
index f080fb8..107fd21 100644
--- a/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
@@ -34,16 +34,44 @@
 ''', expectedErrorsInValidCode: [ParserErrorCode.MISSING_IDENTIFIER]);
   }
 
-  @failingTest
   void test_expressionInPlaceOfTypeName() {
     // https://github.com/dart-lang/sdk/issues/30370
     testRecovery('''
 f() {
   return <g('')>[0, 1, 2];
 }
-''', [], '''
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
 f() {
-  return <_s_>[0, 1, 2];
+  return <g>[0, 1, 2];
+}
+''');
+  }
+
+  void test_expressionInPlaceOfTypeName2() {
+    // https://github.com/dart-lang/sdk/issues/30370
+    testRecovery('''
+f() {
+  return <test('', (){})>[0, 1, 2];
+}
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
+f() {
+  return <test>[0, 1, 2];
+}
+''');
+  }
+
+  @failingTest
+  void test_functionInPlaceOfTypeName() {
+    // https://github.com/dart-lang/sdk/issues/30370
+    // TODO(danrubel): Improve recovery. Currently, the fasta scanner
+    // does not associate `<` with `>` in this situation.
+    testRecovery('''
+f() {
+  return <test('', (){});>[0, 1, 2];
+}
+''', [ParserErrorCode.UNEXPECTED_TOKEN], '''
+f() {
+  return _s_ < test('', (){}); _s_ > [0, 1, 2];
 }
 ''');
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
index dc875ff..ad6cb54 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
@@ -12,23 +12,6 @@
 
 class LocalVariableTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof = <String>[
-      'assert',
-      'block',
-      'break',
-      'continue',
-      'do',
-      'if',
-      'for',
-      'labeled',
-      'localFunctionNonVoid',
-      'localFunctionVoid',
-      'localVariable',
-      'switch',
-      'try',
-      'return',
-      'while'
-    ];
     buildTests(
         'local_variable',
         [
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
index 76e6f1c..e4cfd56 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
@@ -13,17 +13,6 @@
 
 class TopLevelVariableTest extends PartialCodeTest {
   buildAll() {
-    List<String> allExceptEof = <String>[
-      'class',
-      'typedef',
-      'functionVoid',
-      'functionNonVoid',
-      'var',
-      'const',
-      'final',
-      'getter',
-      'setter'
-    ];
     buildTests(
         'top_level_variable',
         [
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index f594ed6..359b16c 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -30,7 +30,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ResynthesizeKernelStrongTest);
+    defineReflectiveTests(ResynthesizeTest_Kernel);
   });
 }
 
@@ -49,7 +49,7 @@
 }
 
 @reflectiveTest
-class ResynthesizeKernelStrongTest extends ResynthesizeTest {
+class ResynthesizeTest_Kernel extends ResynthesizeTest {
   static const DEBUG = false;
 
   final resourceProvider = new MemoryResourceProvider();
@@ -95,27 +95,6 @@
   }
 
   @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_class_constructor_fieldFormal_named_withDefault() async {
-    await super.test_class_constructor_fieldFormal_named_withDefault();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_class_constructor_fieldFormal_optional_withDefault() async {
-    await super.test_class_constructor_fieldFormal_optional_withDefault();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_class_field_const() async {
-    await super.test_class_field_const();
-  }
-
-  @override
   test_class_setter_invalid_named_parameter() async {
     var library = await checkLibrary('class C { void set x({a}) {} }');
     checkElementText(library, r'''
@@ -168,635 +147,6 @@
   test_const_constructor_inferred_args() =>
       super.test_const_constructor_inferred_args();
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_finalField_hasConstConstructor() async {
-    await super.test_const_finalField_hasConstConstructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invalid_field_const() async {
-    await super.test_const_invalid_field_const();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invalid_intLiteral() async {
-    await super.test_const_invalid_intLiteral();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invalid_topLevel() async {
-    await super.test_const_invalid_topLevel();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_named() async {
-    await super.test_const_invokeConstructor_generic_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_named_imported() async {
-    await super.test_const_invokeConstructor_generic_named_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_named_imported_withPrefix() async {
-    return super
-        .test_const_invokeConstructor_generic_named_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_noTypeArguments() async {
-    await super.test_const_invokeConstructor_generic_noTypeArguments();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_unnamed() async {
-    await super.test_const_invokeConstructor_generic_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_unnamed_imported() async {
-    await super.test_const_invokeConstructor_generic_unnamed_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async {
-    return super
-        .test_const_invokeConstructor_generic_unnamed_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named() async {
-    await super.test_const_invokeConstructor_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_imported() async {
-    await super.test_const_invokeConstructor_named_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_imported_withPrefix() async {
-    await super.test_const_invokeConstructor_named_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved() async {
-    await super.test_const_invokeConstructor_named_unresolved();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved2() async {
-    await super.test_const_invokeConstructor_named_unresolved2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved3() async {
-    await super.test_const_invokeConstructor_named_unresolved3();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved4() async {
-    await super.test_const_invokeConstructor_named_unresolved4();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved5() async {
-    await super.test_const_invokeConstructor_named_unresolved5();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_named_unresolved6() async {
-    await super.test_const_invokeConstructor_named_unresolved6();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed() async {
-    await super.test_const_invokeConstructor_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_imported() async {
-    await super.test_const_invokeConstructor_unnamed_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_imported_withPrefix() async {
-    await super.test_const_invokeConstructor_unnamed_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_unresolved() async {
-    await super.test_const_invokeConstructor_unnamed_unresolved();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_unresolved2() async {
-    await super.test_const_invokeConstructor_unnamed_unresolved2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_invokeConstructor_unnamed_unresolved3() async {
-    await super.test_const_invokeConstructor_unnamed_unresolved3();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofClassConstField() async {
-    await super.test_const_length_ofClassConstField();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofClassConstField_imported() async {
-    await super.test_const_length_ofClassConstField_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofClassConstField_imported_withPrefix() async {
-    await super.test_const_length_ofClassConstField_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofStringLiteral() async {
-    await super.test_const_length_ofStringLiteral();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofTopLevelVariable() async {
-    await super.test_const_length_ofTopLevelVariable();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofTopLevelVariable_imported() async {
-    await super.test_const_length_ofTopLevelVariable_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_ofTopLevelVariable_imported_withPrefix() async {
-    await super.test_const_length_ofTopLevelVariable_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_length_staticMethod() async {
-    await super.test_const_length_staticMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_list_inferredType() async {
-    await super.test_const_list_inferredType();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_map_inferredType() async {
-    await super.test_const_map_inferredType();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
-    return super
-        .test_const_parameterDefaultValue_initializingFormal_functionTyped();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_parameterDefaultValue_initializingFormal_named() async {
-    await super.test_const_parameterDefaultValue_initializingFormal_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_parameterDefaultValue_initializingFormal_positional() async {
-    return super
-        .test_const_parameterDefaultValue_initializingFormal_positional();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_parameterDefaultValue_normal() async {
-    await super.test_const_parameterDefaultValue_normal();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticField() async {
-    await super.test_const_reference_staticField();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticField_imported() async {
-    await super.test_const_reference_staticField_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticField_imported_withPrefix() async {
-    await super.test_const_reference_staticField_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticMethod() async {
-    await super.test_const_reference_staticMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticMethod_imported() async {
-    await super.test_const_reference_staticMethod_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_staticMethod_imported_withPrefix() async {
-    await super.test_const_reference_staticMethod_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelFunction() async {
-    await super.test_const_reference_topLevelFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelFunction_generic() async {
-    await super.test_const_reference_topLevelFunction_generic();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelFunction_imported() async {
-    await super.test_const_reference_topLevelFunction_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelFunction_imported_withPrefix() async {
-    await super.test_const_reference_topLevelFunction_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelVariable() async {
-    await super.test_const_reference_topLevelVariable();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelVariable_imported() async {
-    await super.test_const_reference_topLevelVariable_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_topLevelVariable_imported_withPrefix() async {
-    await super.test_const_reference_topLevelVariable_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_type() async {
-    await super.test_const_reference_type();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_type_imported() async {
-    await super.test_const_reference_type_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_type_imported_withPrefix() async {
-    await super.test_const_reference_type_imported_withPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_unresolved_prefix0() async {
-    await super.test_const_reference_unresolved_prefix0();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_unresolved_prefix1() async {
-    await super.test_const_reference_unresolved_prefix1();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_reference_unresolved_prefix2() async {
-    await super.test_const_reference_unresolved_prefix2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_binary() async {
-    await super.test_const_topLevel_binary();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_conditional() async {
-    await super.test_const_topLevel_conditional();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_identical() async {
-    await super.test_const_topLevel_identical();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_ifNull() async {
-    await super.test_const_topLevel_ifNull();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_literal() async {
-    await super.test_const_topLevel_literal();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_parenthesis() async {
-    await super.test_const_topLevel_parenthesis();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_prefix() async {
-    await super.test_const_topLevel_prefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_super() async {
-    await super.test_const_topLevel_super();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_this() async {
-    await super.test_const_topLevel_this();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedList() async {
-    await super.test_const_topLevel_typedList();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedList_imported() async {
-    await super.test_const_topLevel_typedList_imported();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedList_importedWithPrefix() async {
-    await super.test_const_topLevel_typedList_importedWithPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedList_typedefArgument() async {
-    await super.test_const_topLevel_typedList_typedefArgument();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_typedMap() async {
-    await super.test_const_topLevel_typedMap();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_untypedList() async {
-    await super.test_const_topLevel_untypedList();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_const_topLevel_untypedMap() async {
-    await super.test_const_topLevel_untypedMap();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constExpr_pushReference_field_simpleIdentifier() async {
-    await super.test_constExpr_pushReference_field_simpleIdentifier();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
-    await super.test_constExpr_pushReference_staticMethod_simpleIdentifier();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_assertInvocation() async {
-    await super.test_constructor_initializers_assertInvocation();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_assertInvocation_message() async {
-    await super.test_constructor_initializers_assertInvocation_message();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_field() async {
-    await super.test_constructor_initializers_field();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_field_notConst() async {
-    await super.test_constructor_initializers_field_notConst();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_field_withParameter() async {
-    await super.test_constructor_initializers_field_withParameter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_superInvocation_named() async {
-    await super.test_constructor_initializers_superInvocation_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_superInvocation_named_underscore() async {
-    return super
-        .test_constructor_initializers_superInvocation_named_underscore();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_superInvocation_namedExpression() async {
-    return super
-        .test_constructor_initializers_superInvocation_namedExpression();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_superInvocation_unnamed() async {
-    await super.test_constructor_initializers_superInvocation_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_thisInvocation_named() async {
-    await super.test_constructor_initializers_thisInvocation_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_thisInvocation_namedExpression() async {
-    await super.test_constructor_initializers_thisInvocation_namedExpression();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_initializers_thisInvocation_unnamed() async {
-    await super.test_constructor_initializers_thisInvocation_unnamed();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/30258')
   test_constructor_redirected_factory_named_generic() async {
@@ -833,83 +183,6 @@
     await super.test_constructor_redirected_factory_unnamed_prefixed_generic();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_redirected_thisInvocation_named() async {
-    await super.test_constructor_redirected_thisInvocation_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_redirected_thisInvocation_named_generic() async {
-    await super.test_constructor_redirected_thisInvocation_named_generic();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_redirected_thisInvocation_unnamed() async {
-    await super.test_constructor_redirected_thisInvocation_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_redirected_thisInvocation_unnamed_generic() async {
-    await super.test_constructor_redirected_thisInvocation_unnamed_generic();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_constructor_withCycles_const() async {
-    await super.test_constructor_withCycles_const();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_constructor() async {
-    await super.test_defaultValue_refersToGenericClass_constructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_constructor2() async {
-    await super.test_defaultValue_refersToGenericClass_constructor2();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_functionG() async {
-    await super.test_defaultValue_refersToGenericClass_functionG();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_methodG() async {
-    await super.test_defaultValue_refersToGenericClass_methodG();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_methodG_classG() async {
-    await super.test_defaultValue_refersToGenericClass_methodG_classG();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_defaultValue_refersToGenericClass_methodNG() async {
-    await super.test_defaultValue_refersToGenericClass_methodNG();
-  }
-
   @failingTest
   @notForDart2
   test_export_configurations_useFirst() async {
@@ -928,27 +201,6 @@
     await super.test_exportImport_configurations_useFirst();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_field_propagatedType_const_noDep() async {
-    await super.test_field_propagatedType_const_noDep();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_function_async() async {
-    await super.test_function_async();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_function_asyncStar() async {
-    await super.test_function_asyncStar();
-  }
-
   @failingTest
   @override
   test_futureOr() async {
@@ -1001,20 +253,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_infer_generic_typedef_simple() async {
-    await super.test_infer_generic_typedef_simple();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_instantiateToBounds_functionTypeAlias_simple() async {
-    await super.test_instantiateToBounds_functionTypeAlias_simple();
-  }
-
-  @override
-  @failingTest
   test_invalid_annotation_prefixed_constructor() {
     return super.test_invalid_annotation_prefixed_constructor();
   }
@@ -1049,125 +287,18 @@
     await super.test_invalidUri_part_emptyUri();
   }
 
-  @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  @potentialAnalyzerProblem
   test_invalidUris() async {
     await super.test_invalidUris();
   }
 
-  @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_member_function_async() async {
-    await super.test_member_function_async();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_member_function_asyncStar() async {
-    await super.test_member_function_asyncStar();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_member_function_syncStar() async {
-    await super.test_member_function_syncStar();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_classDeclaration() async {
-    await super.test_metadata_classDeclaration();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_classTypeAlias() async {
-    await super.test_metadata_classTypeAlias();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_named() async {
-    await super.test_metadata_constructor_call_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_named_prefixed() async {
-    await super.test_metadata_constructor_call_named_prefixed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_unnamed() async {
-    await super.test_metadata_constructor_call_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_unnamed_prefixed() async {
-    await super.test_metadata_constructor_call_unnamed_prefixed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructor_call_with_args() async {
-    await super.test_metadata_constructor_call_with_args();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructorDeclaration_named() async {
-    await super.test_metadata_constructorDeclaration_named();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_constructorDeclaration_unnamed() async {
-    await super.test_metadata_constructorDeclaration_unnamed();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  @potentialAnalyzerProblem
   test_metadata_enumConstantDeclaration() async {
     await super.test_metadata_enumConstantDeclaration();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_enumDeclaration() async {
-    await super.test_metadata_enumDeclaration();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_exportDirective() async {
-    await super.test_metadata_exportDirective();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_fieldDeclaration() async {
-    await super.test_metadata_fieldDeclaration();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_fieldFormalParameter() async {
@@ -1180,34 +311,6 @@
     await super.test_metadata_fieldFormalParameter_withDefault();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_functionDeclaration_function() async {
-    await super.test_metadata_functionDeclaration_function();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_functionDeclaration_getter() async {
-    await super.test_metadata_functionDeclaration_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_functionDeclaration_setter() async {
-    await super.test_metadata_functionDeclaration_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_functionTypeAlias() async {
-    await super.test_metadata_functionTypeAlias();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_functionTypedFormalParameter() async {
@@ -1220,62 +323,6 @@
     await super.test_metadata_functionTypedFormalParameter_withDefault();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_importDirective() async {
-    await super.test_metadata_importDirective();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_invalid_classDeclaration() async {
-    await super.test_metadata_invalid_classDeclaration();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_libraryDirective() async {
-    await super.test_metadata_libraryDirective();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_methodDeclaration_getter() async {
-    await super.test_metadata_methodDeclaration_getter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_methodDeclaration_method() async {
-    await super.test_metadata_methodDeclaration_method();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_methodDeclaration_setter() async {
-    await super.test_metadata_methodDeclaration_setter();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_partDirective() async {
-    await super.test_metadata_partDirective();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_prefixed_variable() async {
-    await super.test_metadata_prefixed_variable();
-  }
-
   @failingTest
   @FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
   test_metadata_simpleFormalParameter() async {
@@ -1288,41 +335,6 @@
     await super.test_metadata_simpleFormalParameter_withDefault();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_topLevelVariableDeclaration() async {
-    await super.test_metadata_topLevelVariableDeclaration();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_typeParameter_ofClass() async {
-    await super.test_metadata_typeParameter_ofClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_typeParameter_ofClassTypeAlias() async {
-    await super.test_metadata_typeParameter_ofClassTypeAlias();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_typeParameter_ofFunction() async {
-    await super.test_metadata_typeParameter_ofFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_metadata_typeParameter_ofTypedef() async {
-    await super.test_metadata_typeParameter_ofTypedef();
-  }
-
   @failingTest
   @notForDart2
   test_parameter_checked() async {
@@ -1337,59 +349,16 @@
     await super.test_parameter_checked_inherited();
   }
 
-  @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_parameterTypeNotInferred_constructor() async {
-    await super.test_parameterTypeNotInferred_constructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_parameterTypeNotInferred_initializingFormal() async {
-    await super.test_parameterTypeNotInferred_initializingFormal();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_parameterTypeNotInferred_staticMethod() async {
-    await super.test_parameterTypeNotInferred_staticMethod();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_parameterTypeNotInferred_topLevelFunction() async {
-    await super.test_parameterTypeNotInferred_topLevelFunction();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+  @potentialAnalyzerProblem
   test_setter_inferred_type_conflictingInheritance() async {
     await super.test_setter_inferred_type_conflictingInheritance();
   }
 
-  @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_type_reference_to_typedef_with_type_arguments() async {
-    await super.test_type_reference_to_typedef_with_type_arguments();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_type_reference_to_typedef_with_type_arguments_implicit() async {
-    await super.test_type_reference_to_typedef_with_type_arguments_implicit();
-  }
-
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/31711')
-  test_typedef_generic_asFieldType() async {
-    await super.test_typedef_generic_asFieldType();
+  @potentialAnalyzerProblem
+  test_type_inference_based_on_loadLibrary() async {
+    await super.test_type_inference_based_on_loadLibrary();
   }
 
   @failingTest
@@ -1407,28 +376,6 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_instanceCreation_argument_this() async {
-    await super.test_unresolved_annotation_instanceCreation_argument_this();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_namedConstructorCall_noClass() async {
-    await super.test_unresolved_annotation_namedConstructorCall_noClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_namedConstructorCall_noConstructor() async {
-    return super
-        .test_unresolved_annotation_namedConstructorCall_noConstructor();
-  }
-
-  @override
-  @failingTest
   test_unresolved_annotation_prefixedIdentifier_badPrefix() {
     return super.test_unresolved_annotation_prefixedIdentifier_badPrefix();
   }
@@ -1441,71 +388,10 @@
 
   @override
   @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async {
-    return super
-        .test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async {
-    return super
-        .test_unresolved_annotation_prefixedNamedConstructorCall_noClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async {
-    return super
-        .test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async {
-    return super
-        .test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async {
-    return super
-        .test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass();
-  }
-
-  @override
-  @failingTest
   test_unresolved_annotation_simpleIdentifier() {
     return super.test_unresolved_annotation_simpleIdentifier();
   }
 
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_unresolved_annotation_unnamedConstructorCall_noClass() async {
-    await super.test_unresolved_annotation_unnamedConstructorCall_noClass();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_variable_const() async {
-    await super.test_variable_const();
-  }
-
-  @override
-  @failingTest
-  @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
-  test_variable_propagatedType_const_noDep() async {
-    await super.test_variable_propagatedType_const_noDep();
-  }
-
   Future<KernelResynthesizer> _createResynthesizer(Uri testUri) async {
     var logger = new PerformanceLog(null);
     var byteStore = new MemoryByteStore();
diff --git a/pkg/analyzer/tool/generate_files b/pkg/analyzer/tool/generate_files
index 0542717..0dbecaf 100755
--- a/pkg/analyzer/tool/generate_files
+++ b/pkg/analyzer/tool/generate_files
@@ -39,7 +39,7 @@
 DART="${BIN_DIR}/dart"
 
 declare -a VM_OPTIONS
-VM_OPTIONS+=("--checked")
+VM_OPTIONS+=("--enable-asserts")
 VM_OPTIONS+=("--packages=${ROOT_DIR}/.packages")
 
 cd "${SCRIPT_DIR}"
diff --git a/pkg/analyzer_plugin/tool/spec/generate_files b/pkg/analyzer_plugin/tool/spec/generate_files
index df2802d1..0651cb2 100755
--- a/pkg/analyzer_plugin/tool/spec/generate_files
+++ b/pkg/analyzer_plugin/tool/spec/generate_files
@@ -54,7 +54,7 @@
 DART="${BUILD_DIR}/dart-sdk/bin/dart"
 
 declare -a VM_OPTIONS
-VM_OPTIONS+=("--checked")
+VM_OPTIONS+=("--enable-asserts")
 VM_OPTIONS+=("--packages=${PKG_FILE}")
 
 cd "${SCRIPT_DIR}"
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index a06b868..fe5a7c0 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -438,7 +438,8 @@
 
   if (checkedMode && strongMode) {
     checkedMode = false;
-    hints.add("Option '${Flags.enableCheckedMode}' is not needed in Dart 2.0.");
+    hints.add("Option '${Flags.enableCheckedMode}' is not needed in Dart 2.0. "
+        "To enable assertions use '${Flags.enableAsserts}' instead.");
   }
 
   if (trustTypeAnnotations && strongMode) {
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 467d61b..54daa5c 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -1073,11 +1073,13 @@
   /// this current set. This should only be called from [ImportSetLattice],
   /// since it is where we preserve this invariant.
   ImportSet _add(_DeferredImport import) {
-    return _transitions.putIfAbsent(import, () {
-      var result = new ImportSet(new List.from(_imports)..add(import));
+    ImportSet result = _transitions[import];
+    if (result == null) {
+      result = new ImportSet(new List.from(_imports)..add(import));
       result._transitions[import] = result;
-      return result;
-    });
+      _transitions[import] = result;
+    }
+    return result;
   }
 
   String toString() {
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 45f1261..f6b8293 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -23,7 +23,7 @@
 import 'library_loader.dart';
 import 'native/enqueue.dart' show NativeResolutionEnqueuer;
 import 'native/resolver.dart';
-import 'universe/class_hierarchy.dart';
+import 'universe/class_hierarchy_builder.dart';
 import 'universe/world_builder.dart';
 import 'universe/world_impact.dart';
 
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 5b45c23..74e9360 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -1207,8 +1207,7 @@
       // Put the other operators in buckets by size, later to be added in
       // size order.
       int size = computeSize(element);
-      Set<MemberEntity> set =
-          methodSizes.putIfAbsent(size, () => new Setlet<MemberEntity>());
+      Set<MemberEntity> set = methodSizes[size] ??= new Setlet<MemberEntity>();
       set.add(element);
     });
     return methodSizes;
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index b5c8895..6fa9191 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -398,12 +398,14 @@
   MemberTypeInformation getInferredTypeOfMember(MemberEntity member) {
     assert(!member.isAbstract,
         failedAt(member, "Unexpected abstract member $member."));
-    return memberTypeInformations.putIfAbsent(member, () {
-      MemberTypeInformation typeInformation =
-          strategy.createMemberTypeInformation(_abstractValueDomain, member);
-      _orderedTypeInformations.add(typeInformation);
-      return typeInformation;
-    });
+    return memberTypeInformations[member] ??= _getInferredTypeOfMember(member);
+  }
+
+  MemberTypeInformation _getInferredTypeOfMember(MemberEntity member) {
+    MemberTypeInformation typeInformation =
+        strategy.createMemberTypeInformation(_abstractValueDomain, member);
+    _orderedTypeInformations.add(typeInformation);
+    return typeInformation;
   }
 
   /**
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 7311eb2..644cfd2 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -334,50 +334,23 @@
     assert(TypeMask.assertIsNormalized(this, closedWorld));
     assert(TypeMask.assertIsNormalized(other, closedWorld));
     FlatTypeMask flatOther = other;
-
-    ClassEntity otherBase = flatOther.base;
-
-    bool includeNull = isNullable && flatOther.isNullable;
-
-    TypeMask emptyOrNull() {
-      return includeNull
-          ? closedWorld.abstractValueDomain.nullType
-          : closedWorld.abstractValueDomain.emptyType;
+    if (isEmptyOrNull) {
+      return flatOther.isNullable ? this : nonNullable();
+    } else if (flatOther.isEmptyOrNull) {
+      return isNullable ? flatOther : other.nonNullable();
+    } else if (base == flatOther.base) {
+      return intersectionSame(flatOther, closedWorld);
+    } else if (closedWorld.isSubclassOf(flatOther.base, base)) {
+      return intersectionStrictSubclass(flatOther, closedWorld);
+    } else if (closedWorld.isSubclassOf(base, flatOther.base)) {
+      return flatOther.intersectionStrictSubclass(this, closedWorld);
+    } else if (closedWorld.isSubtypeOf(flatOther.base, base)) {
+      return intersectionStrictSubtype(flatOther, closedWorld);
+    } else if (closedWorld.isSubtypeOf(base, flatOther.base)) {
+      return flatOther.intersectionStrictSubtype(this, closedWorld);
+    } else {
+      return intersectionDisjoint(flatOther, closedWorld);
     }
-
-    if (isEmptyOrNull || flatOther.isEmptyOrNull) {
-      return emptyOrNull();
-    }
-
-    SubclassResult result = closedWorld.classHierarchy
-        .commonSubclasses(base, _classQuery, otherBase, flatOther._classQuery);
-
-    FlatTypeMask createSingle(ClassEntity cls) {
-      switch (result.query) {
-        case ClassQuery.EXACT:
-          return includeNull
-              ? new TypeMask.exact(cls, closedWorld)
-              : new TypeMask.nonNullExact(cls, closedWorld);
-        case ClassQuery.SUBCLASS:
-          return includeNull
-              ? new TypeMask.subclass(cls, closedWorld)
-              : new TypeMask.nonNullSubclass(cls, closedWorld);
-        case ClassQuery.SUBTYPE:
-          return includeNull
-              ? new TypeMask.subtype(cls, closedWorld)
-              : new TypeMask.nonNullSubtype(cls, closedWorld);
-      }
-      throw new UnsupportedError("Unexpected ClassQuery: ${result.query}.");
-    }
-
-    List<FlatTypeMask> masks =
-        result.classes.map<FlatTypeMask>(createSingle).toList();
-    if (masks.isEmpty) return emptyOrNull();
-    if (masks.length == 1) return masks.single;
-    if (masks.length > UnionTypeMask.MAX_UNION_LENGTH) {
-      return UnionTypeMask.flatten(masks, closedWorld);
-    }
-    return new UnionTypeMask._internal(masks);
   }
 
   bool isDisjoint(TypeMask other, JClosedWorld closedWorld) {
@@ -459,6 +432,54 @@
     }
   }
 
+  TypeMask intersectionStrictSubtype(
+      FlatTypeMask other, JClosedWorld closedWorld) {
+    assert(base != other.base);
+    assert(closedWorld.isSubtypeOf(other.base, base));
+    if (!isSubtype) return intersectionHelper(other, closedWorld);
+    // Only the other mask puts constraints on the intersection mask,
+    // so base the combined flags on the other mask. Only if both
+    // masks are nullable, will the result be nullable too.
+    // The result is guaranteed to be normalized, as the other type
+    // was normalized.
+    int combined = other.flags & ((flags & 1) | ~1);
+    if (other.flags == combined) {
+      return other;
+    } else {
+      return new FlatTypeMask.normalized(other.base, combined, closedWorld);
+    }
+  }
+
+  TypeMask intersectionDisjoint(FlatTypeMask other, JClosedWorld closedWorld) {
+    assert(base != other.base);
+    assert(!closedWorld.isSubtypeOf(base, other.base));
+    assert(!closedWorld.isSubtypeOf(other.base, base));
+    return intersectionHelper(other, closedWorld);
+  }
+
+  TypeMask intersectionHelper(FlatTypeMask other, JClosedWorld closedWorld) {
+    assert(base != other.base);
+    assert(!closedWorld.isSubclassOf(base, other.base));
+    assert(!closedWorld.isSubclassOf(other.base, base));
+    // If one of the masks are exact or if both of them are subclass
+    // masks, then the intersection is empty.
+    if (isExact || other.isExact) return intersectionEmpty(other);
+    if (isSubclass && other.isSubclass) return intersectionEmpty(other);
+    assert(isSubtype || other.isSubtype);
+    int kind = (isSubclass || other.isSubclass) ? SUBCLASS : SUBTYPE;
+    Iterable<ClassEntity> candidates = closedWorld.commonSubclasses(
+        base, _classQuery, other.base, other._classQuery);
+    if (candidates.isEmpty) return intersectionEmpty(other);
+    // Run through the list of candidates and compute the union. The
+    // result will only be nullable if both masks are nullable. We have
+    // to normalize here, as we generate types based on new base classes.
+    int combined = (kind << 1) | (flags & other.flags & 1);
+    Iterable<TypeMask> masks = candidates.map((ClassEntity cls) {
+      return new FlatTypeMask.normalized(cls, combined, closedWorld);
+    });
+    return UnionTypeMask.unionOf(masks, closedWorld);
+  }
+
   TypeMask intersectionEmpty(FlatTypeMask other) {
     return isNullable && other.isNullable
         ? new TypeMask.empty()
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index 23752a0..2b6ae66 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -9,13 +9,12 @@
 import '../../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
 import '../../elements/entities.dart';
 import '../../types/abstract_value_domain.dart';
-import '../../universe/class_hierarchy.dart';
 import '../../universe/selector.dart' show Selector;
 import '../../universe/use.dart' show DynamicUse;
 import '../../universe/world_builder.dart'
     show UniverseSelectorConstraints, SelectorConstraintsStrategy;
 import '../../util/util.dart';
-import '../../world.dart' show JClosedWorld;
+import '../../world.dart' show ClassQuery, JClosedWorld;
 import '../type_graph_inferrer.dart' show TypeGraphInferrer;
 import 'constants.dart';
 
diff --git a/pkg/compiler/lib/src/io/source_map_builder.dart b/pkg/compiler/lib/src/io/source_map_builder.dart
index ffb6423..c19cfa0 100644
--- a/pkg/compiler/lib/src/io/source_map_builder.dart
+++ b/pkg/compiler/lib/src/io/source_map_builder.dart
@@ -276,13 +276,11 @@
 /// Map from line/column pairs to lists of [T] elements.
 class LineColumnMap<T> {
   Map<int, Map<int, List<T>>> _map = <int, Map<int, List<T>>>{};
-  var _makeLineMap = () => <int, List<T>>{};
-  var _makeList = () => <T>[];
 
   /// Returns the list of elements associated with ([line],[column]).
   List<T> _getList(int line, int column) {
-    Map<int, List<T>> lineMap = _map.putIfAbsent(line, _makeLineMap);
-    return lineMap.putIfAbsent(column, _makeList);
+    Map<int, List<T>> lineMap = _map[line] ??= <int, List<T>>{};
+    return lineMap[column] ??= <T>[];
   }
 
   /// Adds [element] to the end of the list of elements associated with
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 3b6fc65..8b424b6 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -38,7 +38,7 @@
 import '../ssa/ssa.dart' show SsaFunctionCompiler;
 import '../tracer.dart';
 import '../universe/call_structure.dart' show CallStructure;
-import '../universe/class_hierarchy.dart'
+import '../universe/class_hierarchy_builder.dart'
     show ClassHierarchyBuilder, ClassQueries;
 import '../universe/selector.dart' show Selector;
 import '../universe/use.dart' show StaticUse;
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index b7a388a..a438262 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -4,7 +4,7 @@
 
 library js_backend.backend.impact_transformer;
 
-import '../universe/class_hierarchy.dart' show ClassHierarchyBuilder;
+import '../universe/class_hierarchy_builder.dart' show ClassHierarchyBuilder;
 
 import '../common.dart';
 import '../common_elements.dart';
diff --git a/pkg/compiler/lib/src/js_backend/inferred_data.dart b/pkg/compiler/lib/src/js_backend/inferred_data.dart
index 3318b1c..1f5de05 100644
--- a/pkg/compiler/lib/src/js_backend/inferred_data.dart
+++ b/pkg/compiler/lib/src/js_backend/inferred_data.dart
@@ -167,8 +167,7 @@
 
   @override
   SideEffectsBuilder getSideEffectsBuilder(MemberEntity member) {
-    return _sideEffectsBuilders.putIfAbsent(
-        member, () => new SideEffectsBuilder(member));
+    return _sideEffectsBuilders[member] ??= new SideEffectsBuilder(member);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/js_backend/interceptor_data.dart b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
index 3ef09f3..abed251 100644
--- a/pkg/compiler/lib/src/js_backend/interceptor_data.dart
+++ b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
@@ -254,8 +254,8 @@
       if (member.name == Identifiers.call) return;
       // All methods on [Object] are shadowed by [Interceptor].
       if (cls == _commonElements.objectClass) return;
-      Set<MemberEntity> set = _interceptedElements.putIfAbsent(
-          member.name, () => new Set<MemberEntity>());
+      Set<MemberEntity> set =
+          _interceptedElements[member.name] ??= new Set<MemberEntity>();
       set.add(member);
     });
 
@@ -271,8 +271,8 @@
           (ClassEntity cls, MemberEntity member) {
         // All methods on [Object] are shadowed by [Interceptor].
         if (cls == _commonElements.objectClass) return;
-        Set<MemberEntity> set = _interceptedElements.putIfAbsent(
-            member.name, () => new Set<MemberEntity>());
+        Set<MemberEntity> set =
+            _interceptedElements[member.name] ??= new Set<MemberEntity>();
         set.add(member);
       });
     }
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 54863e5..a449b52 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -13,11 +13,10 @@
 import '../js/js.dart' show js;
 import '../js_emitter/js_emitter.dart' show Emitter;
 import '../options.dart';
-import '../universe/class_hierarchy.dart';
 import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
-import '../world.dart' show JClosedWorld, KClosedWorld;
+import '../world.dart' show ClassQuery, JClosedWorld, KClosedWorld;
 import 'backend_usage.dart';
 import 'namer.dart';
 import 'native_data.dart';
@@ -1470,8 +1469,7 @@
         classesNeedingTypeArguments.add(cls);
 
         // TODO(ngeoffray): This should use subclasses, not subtypes.
-        closedWorld.classHierarchy.forEachStrictSubtypeOf(cls,
-            (ClassEntity sub) {
+        closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity sub) {
           potentiallyNeedTypeArguments(sub);
         });
       } else if (entity is FunctionEntity) {
@@ -1696,16 +1694,19 @@
                 impliedClass(runtimeTypeUse.argumentType);
 
             // TODO(johnniwinther): Special case use of `this.runtimeType`.
-            SubclassResult result = closedWorld.classHierarchy.commonSubclasses(
-                receiverClass,
-                ClassQuery.SUBTYPE,
-                argumentClass,
-                ClassQuery.SUBTYPE);
-
-            for (ClassEntity cls in result.classes) {
-              addClass(cls);
-              if (neededOnAll) break;
+            if (closedWorld.isSubtypeOf(receiverClass, argumentClass)) {
+              addClass(receiverClass);
+            } else if (closedWorld.isSubtypeOf(argumentClass, receiverClass)) {
+              addClass(argumentClass);
             }
+            if (neededOnAll) break;
+            // TODO(johnniwinther): Special case use of `this.runtimeType`.
+            // TODO(johnniwinther): Rename [commonSubclasses] to something like
+            // [strictCommonClasses] and support the non-strict case directly.
+            // Since we do a subclassesOf
+            classesDirectlyNeedingRuntimeType.addAll(
+                closedWorld.commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
+                    argumentClass, ClassQuery.SUBTYPE));
             break;
           case RuntimeTypeUseKind.unknown:
             addClass(impliedClass(runtimeTypeUse.receiverType));
@@ -1716,17 +1717,15 @@
       Set<ClassEntity> allClassesNeedingRuntimeType;
       if (neededOnAll) {
         neededOnFunctions = true;
-        allClassesNeedingRuntimeType = closedWorld.classHierarchy
-            .subclassesOf(commonElements.objectClass)
-            .toSet();
+        allClassesNeedingRuntimeType =
+            closedWorld.subclassesOf(commonElements.objectClass).toSet();
       } else {
         allClassesNeedingRuntimeType = new Set<ClassEntity>();
         // TODO(johnniwinther): Support this operation directly in
         // [ClosedWorld] using the [ClassSet]s.
         for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
           if (!allClassesNeedingRuntimeType.contains(cls)) {
-            allClassesNeedingRuntimeType
-                .addAll(closedWorld.classHierarchy.subtypesOf(cls));
+            allClassesNeedingRuntimeType.addAll(closedWorld.subtypesOf(cls));
           }
         }
       }
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 1f4923a..6b68731 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -289,10 +289,10 @@
       });
     }
 
-    closedWorld.classHierarchy
+    closedWorld
         .getClassHierarchyNode(closedWorld.commonElements.objectClass)
         .forEachSubclass((ClassEntity cls) {
-      convertClassSet(closedWorld.classHierarchy.getClassSet(cls));
+      convertClassSet(closedWorld.getClassSet(cls));
     }, ClassHierarchyNode.ALL);
 
     Set<MemberEntity> liveInstanceMembers =
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index b3e5f49..1af442c 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -43,7 +43,7 @@
 import '../ordered_typeset.dart';
 import '../ssa/kernel_impact.dart';
 import '../ssa/type_builder.dart';
-import '../universe/class_hierarchy.dart';
+import '../universe/class_hierarchy_builder.dart';
 import '../universe/class_set.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
@@ -930,215 +930,222 @@
   }
 
   LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]) {
-    return _libraryMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "library for $node.");
-      Uri canonicalUri = node.importUri;
-      String name = node.name;
-      if (name == null) {
-        // Use the file name as script name.
-        String path = canonicalUri.path;
-        name = path.substring(path.lastIndexOf('/') + 1);
-      }
-      IndexedLibrary library = createLibrary(name, canonicalUri);
-      return _libraries.register(library, new LibraryData(node),
-          libraryEnv ?? _env.lookupLibrary(canonicalUri));
-    });
+    return _libraryMap[node] ??= _getLibraryCreate(node, libraryEnv);
+  }
+
+  LibraryEntity _getLibraryCreate(ir.Library node, LibraryEnv libraryEnv) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "library for $node.");
+    Uri canonicalUri = node.importUri;
+    String name = node.name;
+    if (name == null) {
+      // Use the file name as script name.
+      String path = canonicalUri.path;
+      name = path.substring(path.lastIndexOf('/') + 1);
+    }
+    IndexedLibrary library = createLibrary(name, canonicalUri);
+    return _libraries.register(library, new LibraryData(node),
+        libraryEnv ?? _env.lookupLibrary(canonicalUri));
   }
 
   ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) {
-    return _classMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "class for $node.");
-      KLibrary library = _getLibrary(node.enclosingLibrary);
-      if (classEnv == null) {
-        classEnv = _libraries.getEnv(library).lookupClass(node.name);
-      }
-      IndexedClass cls =
-          createClass(library, node.name, isAbstract: node.isAbstract);
-      return _classes.register(cls,
-          new ClassData(node, new RegularClassDefinition(cls, node)), classEnv);
-    });
+    return _classMap[node] ??= _getClassCreate(node, classEnv);
+  }
+
+  ClassEntity _getClassCreate(ir.Class node, ClassEnv classEnv) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "class for $node.");
+    KLibrary library = _getLibrary(node.enclosingLibrary);
+    if (classEnv == null) {
+      classEnv = _libraries.getEnv(library).lookupClass(node.name);
+    }
+    IndexedClass cls =
+        createClass(library, node.name, isAbstract: node.isAbstract);
+    return _classes.register(cls,
+        new ClassData(node, new RegularClassDefinition(cls, node)), classEnv);
   }
 
   TypedefEntity _getTypedef(ir.Typedef node) {
-    return _typedefMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "typedef for $node.");
-      IndexedLibrary library = _getLibrary(node.enclosingLibrary);
-      IndexedTypedef typedef = createTypedef(library, node.name);
-      TypedefType typedefType = new TypedefType(
-          typedef,
-          new List<DartType>.filled(
-              node.typeParameters.length, const DynamicType()));
-      return _typedefs.register(
-          typedef, new TypedefData(node, typedef, typedefType));
-    });
+    return _typedefMap[node] ??= _getTypedefCreate(node);
+  }
+
+  TypedefEntity _getTypedefCreate(ir.Typedef node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "typedef for $node.");
+    IndexedLibrary library = _getLibrary(node.enclosingLibrary);
+    IndexedTypedef typedef = createTypedef(library, node.name);
+    TypedefType typedefType = new TypedefType(
+        typedef,
+        new List<DartType>.filled(
+            node.typeParameters.length, const DynamicType()));
+    return _typedefs.register(
+        typedef, new TypedefData(node, typedef, typedefType));
   }
 
   TypeVariableEntity _getTypeVariable(ir.TypeParameter node) {
-    return _typeVariableMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "type variable for $node.");
-      if (node.parent is ir.Class) {
-        ir.Class cls = node.parent;
-        int index = cls.typeParameters.indexOf(node);
-        return _typeVariables.register(
-            createTypeVariable(_getClass(cls), node.name, index),
-            new TypeVariableData(node));
-      }
-      if (node.parent is ir.FunctionNode) {
-        ir.FunctionNode func = node.parent;
-        int index = func.typeParameters.indexOf(node);
-        if (func.parent is ir.Constructor) {
-          ir.Constructor constructor = func.parent;
-          ir.Class cls = constructor.enclosingClass;
+    return _typeVariableMap[node] ??= _getTypeVariableCreate(node);
+  }
+
+  TypeVariableEntity _getTypeVariableCreate(ir.TypeParameter node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "type variable for $node.");
+    if (node.parent is ir.Class) {
+      ir.Class cls = node.parent;
+      int index = cls.typeParameters.indexOf(node);
+      return _typeVariables.register(
+          createTypeVariable(_getClass(cls), node.name, index),
+          new TypeVariableData(node));
+    }
+    if (node.parent is ir.FunctionNode) {
+      ir.FunctionNode func = node.parent;
+      int index = func.typeParameters.indexOf(node);
+      if (func.parent is ir.Constructor) {
+        ir.Constructor constructor = func.parent;
+        ir.Class cls = constructor.enclosingClass;
+        return _getTypeVariable(cls.typeParameters[index]);
+      } else if (func.parent is ir.Procedure) {
+        ir.Procedure procedure = func.parent;
+        if (procedure.kind == ir.ProcedureKind.Factory) {
+          ir.Class cls = procedure.enclosingClass;
           return _getTypeVariable(cls.typeParameters[index]);
-        } else if (func.parent is ir.Procedure) {
-          ir.Procedure procedure = func.parent;
-          if (procedure.kind == ir.ProcedureKind.Factory) {
-            ir.Class cls = procedure.enclosingClass;
-            return _getTypeVariable(cls.typeParameters[index]);
-          } else {
-            return _typeVariables.register(
-                createTypeVariable(_getMethod(procedure), node.name, index),
-                new TypeVariableData(node));
-          }
         } else {
-          throw new UnsupportedError(
-              'Unsupported function type parameter parent '
-              'node ${func.parent}.');
+          return _typeVariables.register(
+              createTypeVariable(_getMethod(procedure), node.name, index),
+              new TypeVariableData(node));
         }
+      } else {
+        throw new UnsupportedError('Unsupported function type parameter parent '
+            'node ${func.parent}.');
       }
-      throw new UnsupportedError('Unsupported type parameter type node $node.');
-    });
+    }
+    throw new UnsupportedError('Unsupported type parameter type node $node.');
   }
 
   ConstructorEntity _getConstructor(ir.Member node) {
-    return _constructorMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "constructor for $node.");
-      MemberDefinition definition;
-      ir.FunctionNode functionNode;
-      ClassEntity enclosingClass = _getClass(node.enclosingClass);
-      Name name = getName(node.name);
-      bool isExternal = node.isExternal;
+    return _constructorMap[node] ??= _getConstructorCreate(node);
+  }
 
-      IndexedConstructor constructor;
-      if (node is ir.Constructor) {
-        functionNode = node.function;
-        constructor = createGenerativeConstructor(enclosingClass, name,
-            _getParameterStructure(functionNode, includeTypeParameters: false),
-            isExternal: isExternal, isConst: node.isConst);
-        definition = new SpecialMemberDefinition(
-            constructor, node, MemberKind.constructor);
-      } else if (node is ir.Procedure) {
-        functionNode = node.function;
-        bool isFromEnvironment = isExternal &&
-            name.text == 'fromEnvironment' &&
-            const ['int', 'bool', 'String'].contains(enclosingClass.name);
-        constructor = createFactoryConstructor(enclosingClass, name,
-            _getParameterStructure(functionNode, includeTypeParameters: false),
-            isExternal: isExternal,
-            isConst: node.isConst,
-            isFromEnvironmentConstructor: isFromEnvironment);
-        definition = new RegularMemberDefinition(constructor, node);
-      } else {
-        // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
-        throw failedAt(
-            NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
-      }
-      return _members.register<IndexedConstructor, ConstructorData>(
-          constructor, new ConstructorDataImpl(node, functionNode, definition));
-    });
+  ConstructorEntity _getConstructorCreate(ir.Member node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "constructor for $node.");
+    MemberDefinition definition;
+    ir.FunctionNode functionNode;
+    ClassEntity enclosingClass = _getClass(node.enclosingClass);
+    Name name = getName(node.name);
+    bool isExternal = node.isExternal;
+
+    IndexedConstructor constructor;
+    if (node is ir.Constructor) {
+      functionNode = node.function;
+      constructor = createGenerativeConstructor(enclosingClass, name,
+          _getParameterStructure(functionNode, includeTypeParameters: false),
+          isExternal: isExternal, isConst: node.isConst);
+      definition = new SpecialMemberDefinition(
+          constructor, node, MemberKind.constructor);
+    } else if (node is ir.Procedure) {
+      functionNode = node.function;
+      bool isFromEnvironment = isExternal &&
+          name.text == 'fromEnvironment' &&
+          const ['int', 'bool', 'String'].contains(enclosingClass.name);
+      constructor = createFactoryConstructor(enclosingClass, name,
+          _getParameterStructure(functionNode, includeTypeParameters: false),
+          isExternal: isExternal,
+          isConst: node.isConst,
+          isFromEnvironmentConstructor: isFromEnvironment);
+      definition = new RegularMemberDefinition(constructor, node);
+    } else {
+      // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
+      throw failedAt(
+          NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
+    }
+    return _members.register<IndexedConstructor, ConstructorData>(
+        constructor, new ConstructorDataImpl(node, functionNode, definition));
   }
 
   FunctionEntity _getMethod(ir.Procedure node) {
-    return _methodMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "function for $node.");
-      LibraryEntity library;
-      ClassEntity enclosingClass;
-      if (node.enclosingClass != null) {
-        enclosingClass = _getClass(node.enclosingClass);
-        library = enclosingClass.library;
-      } else {
-        library = _getLibrary(node.enclosingLibrary);
-      }
-      Name name = getName(node.name);
-      bool isStatic = node.isStatic;
-      bool isExternal = node.isExternal;
-      // TODO(johnniwinther): Remove `&& !node.isExternal` when #31233 is fixed.
-      bool isAbstract = node.isAbstract && !node.isExternal;
-      AsyncMarker asyncMarker = getAsyncMarker(node.function);
-      IndexedFunction function;
-      switch (node.kind) {
-        case ir.ProcedureKind.Factory:
-          throw new UnsupportedError("Cannot create method from factory.");
-        case ir.ProcedureKind.Getter:
-          function = createGetter(library, enclosingClass, name, asyncMarker,
-              isStatic: isStatic,
-              isExternal: isExternal,
-              isAbstract: isAbstract);
-          break;
-        case ir.ProcedureKind.Method:
-        case ir.ProcedureKind.Operator:
-          function = createMethod(library, enclosingClass, name,
-              _getParameterStructure(node.function), asyncMarker,
-              isStatic: isStatic,
-              isExternal: isExternal,
-              isAbstract: isAbstract);
-          break;
-        case ir.ProcedureKind.Setter:
-          assert(asyncMarker == AsyncMarker.SYNC);
-          function = createSetter(library, enclosingClass, name.setter,
-              isStatic: isStatic,
-              isExternal: isExternal,
-              isAbstract: isAbstract);
-          break;
-      }
-      return _members.register<IndexedFunction, FunctionData>(
-          function,
-          new FunctionDataImpl(node, node.function,
-              new RegularMemberDefinition(function, node)));
-    });
+    return _methodMap[node] ??= _getMethodCreate(node);
+  }
+
+  FunctionEntity _getMethodCreate(ir.Procedure node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "function for $node.");
+    LibraryEntity library;
+    ClassEntity enclosingClass;
+    if (node.enclosingClass != null) {
+      enclosingClass = _getClass(node.enclosingClass);
+      library = enclosingClass.library;
+    } else {
+      library = _getLibrary(node.enclosingLibrary);
+    }
+    Name name = getName(node.name);
+    bool isStatic = node.isStatic;
+    bool isExternal = node.isExternal;
+    // TODO(johnniwinther): Remove `&& !node.isExternal` when #31233 is fixed.
+    bool isAbstract = node.isAbstract && !node.isExternal;
+    AsyncMarker asyncMarker = getAsyncMarker(node.function);
+    IndexedFunction function;
+    switch (node.kind) {
+      case ir.ProcedureKind.Factory:
+        throw new UnsupportedError("Cannot create method from factory.");
+      case ir.ProcedureKind.Getter:
+        function = createGetter(library, enclosingClass, name, asyncMarker,
+            isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+        break;
+      case ir.ProcedureKind.Method:
+      case ir.ProcedureKind.Operator:
+        function = createMethod(library, enclosingClass, name,
+            _getParameterStructure(node.function), asyncMarker,
+            isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+        break;
+      case ir.ProcedureKind.Setter:
+        assert(asyncMarker == AsyncMarker.SYNC);
+        function = createSetter(library, enclosingClass, name.setter,
+            isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+        break;
+    }
+    return _members.register<IndexedFunction, FunctionData>(
+        function,
+        new FunctionDataImpl(
+            node, node.function, new RegularMemberDefinition(function, node)));
   }
 
   FieldEntity _getField(ir.Field node) {
-    return _fieldMap.putIfAbsent(node, () {
-      assert(
-          !_envIsClosed,
-          "Environment of $this is closed. Trying to create "
-          "field for $node.");
-      LibraryEntity library;
-      ClassEntity enclosingClass;
-      if (node.enclosingClass != null) {
-        enclosingClass = _getClass(node.enclosingClass);
-        library = enclosingClass.library;
-      } else {
-        library = _getLibrary(node.enclosingLibrary);
-      }
-      Name name = getName(node.name);
-      bool isStatic = node.isStatic;
-      IndexedField field = createField(library, enclosingClass, name,
-          isStatic: isStatic,
-          isAssignable: node.isMutable,
-          isConst: node.isConst);
-      return _members.register<IndexedField, FieldData>(field,
-          new FieldDataImpl(node, new RegularMemberDefinition(field, node)));
-    });
+    return _fieldMap[node] ??= _getFieldCreate(node);
+  }
+
+  FieldEntity _getFieldCreate(ir.Field node) {
+    assert(
+        !_envIsClosed,
+        "Environment of $this is closed. Trying to create "
+        "field for $node.");
+    LibraryEntity library;
+    ClassEntity enclosingClass;
+    if (node.enclosingClass != null) {
+      enclosingClass = _getClass(node.enclosingClass);
+      library = enclosingClass.library;
+    } else {
+      library = _getLibrary(node.enclosingLibrary);
+    }
+    Name name = getName(node.name);
+    bool isStatic = node.isStatic;
+    IndexedField field = createField(library, enclosingClass, name,
+        isStatic: isStatic,
+        isAssignable: node.isMutable,
+        isConst: node.isConst);
+    return _members.register<IndexedField, FieldData>(field,
+        new FieldDataImpl(node, new RegularMemberDefinition(field, node)));
   }
 
   ParameterStructure _getParameterStructure(ir.FunctionNode node,
@@ -2073,6 +2080,9 @@
 
   final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
 
+  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
+  final Map<ClassEntity, ClassSet> _classSets;
+
   // TODO(johnniwinther): Can this be derived from [ClassSet]s?
   final Set<ClassEntity> _implementedClasses;
 
@@ -2086,8 +2096,6 @@
 
   final Iterable<MemberEntity> processedMembers;
 
-  final ClassHierarchy classHierarchy;
-
   KClosedWorldImpl(this.elementMap,
       {CompilerOptions options,
       this.elementEnvironment,
@@ -2110,8 +2118,8 @@
       Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
       Map<ClassEntity, ClassSet> classSets})
       : _implementedClasses = implementedClasses,
-        classHierarchy = new ClassHierarchyImpl(
-            commonElements, classHierarchyNodes, classSets) {
+        _classHierarchyNodes = classHierarchyNodes,
+        _classSets = classSets {
     computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, options);
   }
 
@@ -2119,6 +2127,152 @@
   bool isImplemented(ClassEntity cls) {
     return _implementedClasses.contains(cls);
   }
+
+  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
+  /// of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls) {
+    return _classHierarchyNodes[cls];
+  }
+
+  /// Returns [ClassSet] for [cls] used to model the extends and implements
+  /// relations of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassSet getClassSet(ClassEntity cls) {
+    return _classSets[cls];
+  }
+
+  // TODO(johnniwinther): Share the methods based on [ClassSet] and
+  // [ClassHierarchyNode] between KClosedWorld and JClosedWorld.
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y) {
+    ClassSet classSet = _classSets[y];
+    assert(classSet != null,
+        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${_classSets}"));
+    ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
+    assert(classHierarchyNode != null,
+        failedAt(x, "No ClassHierarchyNode for $x"));
+    return classSet.hasSubtype(classHierarchyNode);
+  }
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      return const <ClassEntity>[];
+    } else {
+      return classSet
+          .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+    }
+  }
+
+  /// Returns an iterable over the directly instantiated classes that extend
+  /// [cls] possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
+    ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
+    if (hierarchy == null) return const <ClassEntity>[];
+    return hierarchy
+        .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+  }
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// _not_ including [cls].
+  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) {
+      return const <ClassEntity>[];
+    } else {
+      return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+          strict: true);
+    }
+  }
+
+  Iterable<ClassEntity> getInterfaces(ClassEntity cls) {
+    return elementMap._getInterfaces(cls).map((t) => t.element);
+  }
+
+  ClassEntity getSuperClass(ClassEntity cls) {
+    return elementMap._getSuperType(cls)?.element;
+  }
+
+  /// Returns an iterable over the directly instantiated classes that extend
+  /// [cls] _not_ including [cls] itself.
+  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
+    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+    if (subclasses == null) return const <ClassEntity>[];
+    return subclasses.subclassesByMask(
+        ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
+
+  Set<ClassEntity> _commonContainedClasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    Iterable<ClassEntity> xSubset = _containedSubset(cls1, query1);
+    if (xSubset == null) return null;
+    Iterable<ClassEntity> ySubset = _containedSubset(cls2, query2);
+    if (ySubset == null) return null;
+    return xSubset.toSet().intersection(ySubset.toSet());
+  }
+
+  Iterable<ClassEntity> _containedSubset(ClassEntity cls, ClassQuery query) {
+    switch (query) {
+      case ClassQuery.EXACT:
+        return null;
+      case ClassQuery.SUBCLASS:
+        return strictSubclassesOf(cls);
+      case ClassQuery.SUBTYPE:
+        return strictSubtypesOf(cls);
+    }
+    throw new ArgumentError('Unexpected query: $query.');
+  }
+
+  Iterable<ClassEntity> commonSubclasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    // TODO(johnniwinther): Use [ClassSet] to compute this.
+    // Compute the set of classes that are contained in both class subsets.
+    Set<ClassEntity> common =
+        _commonContainedClasses(cls1, query1, cls2, query2);
+    if (common == null || common.isEmpty) return const <ClassEntity>[];
+    // Narrow down the candidates by only looking at common classes
+    // that do not have a superclass or supertype that will be a
+    // better candidate.
+    return common.where((ClassEntity each) {
+      bool containsSuperclass = common.contains(getSuperClass(each));
+      // If the superclass is also a candidate, then we don't want to
+      // deal with this class. If we're only looking for a subclass we
+      // know we don't have to look at the list of interfaces because
+      // they can never be in the common set.
+      if (containsSuperclass ||
+          query1 == ClassQuery.SUBCLASS ||
+          query2 == ClassQuery.SUBCLASS) {
+        return !containsSuperclass;
+      }
+      // Run through the direct supertypes of the class. If the common
+      // set contains the direct supertype of the class, we ignore the
+      // the class because the supertype is a better candidate.
+
+      for (ClassEntity interface in getInterfaces(each)) {
+        if (common.contains(interface)) return false;
+      }
+      return true;
+    });
+  }
+
+  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
+  /// itself.
+  void forEachStrictSubtypeOf(
+      ClassEntity cls, IterationStep f(ClassEntity cls)) {
+    ClassSet classSet = _classSets[cls];
+    if (classSet == null) return;
+    classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+        strict: true);
+  }
 }
 
 // Interface for testing equivalence of Kernel-based entities.
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 9e91d03..19e2aa3 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -31,7 +31,7 @@
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../native/resolver.dart';
 import '../options.dart';
-import '../universe/class_hierarchy.dart';
+import '../universe/class_hierarchy_builder.dart';
 import '../universe/world_builder.dart';
 import '../universe/world_impact.dart';
 import 'deferred_load.dart';
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index 0de573e..543d330 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -271,7 +271,7 @@
 
     _elementEnvironment.forEachSupertype(cls, (InterfaceType type) {
       List<ClassEntity> subtypes =
-          emitter.subtypes.putIfAbsent(type.element, () => <ClassEntity>[]);
+          emitter.subtypes[type.element] ??= <ClassEntity>[];
       subtypes.add(cls);
     });
 
@@ -286,7 +286,7 @@
     }
 
     List<ClassEntity> directSubtypes =
-        emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]);
+        emitter.directSubtypes[superclass] ??= <ClassEntity>[];
     directSubtypes.add(cls);
   }
 
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 866d70c..fc870e9 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -277,6 +277,8 @@
   /// Create an options object by parsing flags from [options].
   static CompilerOptions parse(List<String> options,
       {Uri libraryRoot, Uri platformBinaries}) {
+    bool isStrong = _hasOption(options, Flags.strongMode) ||
+        !_hasOption(options, Flags.noPreviewDart2);
     return new CompilerOptions()
       ..libraryRoot = libraryRoot
       ..allowMockCompilation = _hasOption(options, Flags.allowMockCompilation)
@@ -307,8 +309,8 @@
       ..enableMinification = _hasOption(options, Flags.minify)
       ..enableNativeLiveTypeAnalysis =
           !_hasOption(options, Flags.disableNativeLiveTypeAnalysis)
-      ..enableTypeAssertions = _hasOption(options, Flags.enableCheckedMode) &&
-          !_hasOption(options, Flags.strongMode)
+      ..enableTypeAssertions =
+          _hasOption(options, Flags.enableCheckedMode) && !isStrong
       ..enableUserAssertions = _hasOption(options, Flags.enableCheckedMode) ||
           _hasOption(options, Flags.enableAsserts)
       ..experimentalTrackAllocations =
@@ -325,8 +327,7 @@
       ..platformBinaries =
           platformBinaries ?? _extractUriOption(options, '--platform-binaries=')
       ..sourceMapUri = _extractUriOption(options, '--source-map=')
-      ..strongMode = _hasOption(options, Flags.strongMode) ||
-          !_hasOption(options, Flags.noPreviewDart2)
+      ..strongMode = isStrong
       ..omitImplicitChecks = _hasOption(options, Flags.omitImplicitChecks)
       ..laxRuntimeTypeToString =
           _hasOption(options, Flags.laxRuntimeTypeToString)
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy.dart b/pkg/compiler/lib/src/universe/class_hierarchy.dart
deleted file mode 100644
index f19320a..0000000
--- a/pkg/compiler/lib/src/universe/class_hierarchy.dart
+++ /dev/null
@@ -1,543 +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 '../common.dart';
-import '../common_elements.dart';
-import '../elements/entities.dart';
-import '../elements/types.dart' show InterfaceType;
-import 'class_set.dart';
-
-// TODO(johnniwinther): Move more methods from `JClosedWorld` to
-// `ClassHierarchy`.
-abstract class ClassHierarchy {
-  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
-  /// of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
-
-  /// Returns [ClassSet] for [cls] used to model the extends and implements
-  /// relations of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassSet getClassSet(ClassEntity cls);
-
-  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
-  /// instance of [y].
-  bool isSubtypeOf(ClassEntity x, ClassEntity y);
-
-  /// Returns a [SubclassResult] for the subclasses that are contained in
-  /// the subclass/subtype sets of both [cls1] and [cls2].
-  ///
-  /// Classes that are implied by included superclasses/supertypes are not
-  /// returned.
-  ///
-  /// For instance for this hierarchy
-  ///
-  ///     class A {}
-  ///     class B {}
-  ///     class C implements A, B {}
-  ///     class D extends C {}
-  ///
-  /// the query
-  ///
-  ///     commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
-  ///
-  /// return the set {C} because [D] is implied by [C].
-  SubclassResult commonSubclasses(
-      ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subtypesOf(ClassEntity cls);
-
-  /// Returns an iterable over the live classes that extend [cls] including
-  /// [cls] itself.
-  Iterable<ClassEntity> subclassesOf(ClassEntity cls);
-
-  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubtypeOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls));
-}
-
-class ClassHierarchyImpl implements ClassHierarchy {
-  final CommonElements _commonElements;
-  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
-  final Map<ClassEntity, ClassSet> _classSets;
-
-  ClassHierarchyImpl(
-      this._commonElements, this._classHierarchyNodes, this._classSets);
-
-  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
-  /// of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls) {
-    return _classHierarchyNodes[cls];
-  }
-
-  /// Returns [ClassSet] for [cls] used to model the extends and implements
-  /// relations of known classes.
-  ///
-  /// This method is only provided for testing. For queries on classes, use the
-  /// methods defined in [JClosedWorld].
-  ClassSet getClassSet(ClassEntity cls) {
-    return _classSets[cls];
-  }
-
-  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
-  /// instance of [y].
-  bool isSubtypeOf(ClassEntity x, ClassEntity y) {
-    ClassSet classSet = _classSets[y];
-    assert(classSet != null,
-        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${_classSets}"));
-    ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
-    assert(classHierarchyNode != null,
-        failedAt(x, "No ClassHierarchyNode for $x"));
-    return classSet.hasSubtype(classHierarchyNode);
-  }
-
-  /// Return `true` if [x] is a (non-strict) subclass of [y].
-  bool isSubclassOf(ClassEntity x, ClassEntity y) {
-    return _classHierarchyNodes[y].hasSubclass(_classHierarchyNodes[x]);
-  }
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) {
-      return const <ClassEntity>[];
-    } else {
-      return classSet
-          .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
-    }
-  }
-
-  /// Returns an iterable over the directly instantiated classes that extend
-  /// [cls] possibly including [cls] itself, if it is live.
-  Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
-    ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
-    if (hierarchy == null) return const <ClassEntity>[];
-    return hierarchy
-        .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
-  }
-
-  /// Returns an iterable over the directly instantiated that implement [cls]
-  /// _not_ including [cls].
-  Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) {
-      return const <ClassEntity>[];
-    } else {
-      return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-          strict: true);
-    }
-  }
-
-  /// Returns an iterable over the directly instantiated classes that extend
-  /// [cls] _not_ including [cls] itself.
-  Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return const <ClassEntity>[];
-    return subclasses.subclassesByMask(
-        ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  /// Applies [f] to each live class that extend [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubclassOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls)) {
-    ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
-    if (subclasses == null) return;
-    subclasses.forEachSubclass(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
-  /// itself.
-  void forEachStrictSubtypeOf(
-      ClassEntity cls, IterationStep f(ClassEntity cls)) {
-    ClassSet classSet = _classSets[cls];
-    if (classSet == null) return;
-    classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
-        strict: true);
-  }
-
-  SubclassResult commonSubclasses(ClassEntity cls1, ClassQuery query1,
-      ClassEntity cls2, ClassQuery query2) {
-    if (query1 == ClassQuery.EXACT && query2 == ClassQuery.EXACT) {
-      // Exact classes [cls1] and [cls2] must be identical to have any classes
-      // in common.
-      if (cls1 != cls2) {
-        return const SubclassResult.empty();
-      }
-      return new SubclassResult.exact(cls1);
-    } else if (query1 == ClassQuery.EXACT) {
-      if (query2 == ClassQuery.SUBCLASS) {
-        // Exact [cls1] must be a subclass of [cls2] to have any classes in
-        // common.
-        if (isSubclassOf(cls1, cls2)) {
-          return new SubclassResult.exact(cls1);
-        }
-      } else if (query2 == ClassQuery.SUBTYPE) {
-        // Exact [cls1] must be a subtype of [cls2] to have any classes in
-        // common.
-        if (isSubtypeOf(cls1, cls2)) {
-          return new SubclassResult.exact(cls1);
-        }
-      }
-      return const SubclassResult.empty();
-    } else if (query2 == ClassQuery.EXACT) {
-      if (query1 == ClassQuery.SUBCLASS) {
-        // Exact [cls2] must be a subclass of [cls1] to have any classes in
-        // common.
-        if (isSubclassOf(cls2, cls1)) {
-          return new SubclassResult.exact(cls2);
-        }
-      } else if (query1 == ClassQuery.SUBTYPE) {
-        // Exact [cls2] must be a subtype of [cls1] to have any classes in
-        // common.
-        if (isSubtypeOf(cls2, cls1)) {
-          return new SubclassResult.exact(cls2);
-        }
-      }
-      return const SubclassResult.empty();
-    } else if (query1 == ClassQuery.SUBCLASS && query2 == ClassQuery.SUBCLASS) {
-      // [cls1] must be a subclass of [cls2] or vice versa to have any classes
-      // in common.
-      if (cls1 == cls2 || isSubclassOf(cls1, cls2)) {
-        // The subclasses of [cls1] are contained within the subclasses of
-        // [cls2].
-        return new SubclassResult.subclass(cls1);
-      } else if (isSubclassOf(cls2, cls1)) {
-        // The subclasses of [cls2] are contained within the subclasses of
-        // [cls1].
-        return new SubclassResult.subclass(cls2);
-      }
-      return const SubclassResult.empty();
-    } else if (query1 == ClassQuery.SUBCLASS) {
-      if (isSubtypeOf(cls1, cls2)) {
-        // The subclasses of [cls1] are all subtypes of [cls2].
-        return new SubclassResult.subclass(cls1);
-      }
-      if (cls1 == _commonElements.objectClass) {
-        // Since [cls1] is `Object` all subtypes of [cls2] are contained within
-        // the subclasses of [cls1].
-        return new SubclassResult.subtype(cls2);
-      }
-      // Find all the root subclasses of [cls1] of that implement [cls2].
-      //
-      // For this hierarchy:
-      //
-      //     class I {}
-      //     class A {}
-      //     class B extends A implements I {}
-      //     class C extends B {}
-      //     class D extends A implements I {}
-      //
-      // the common subclasses of "subclass of A" and "subtype of I" returns
-      // "subclasses of {B, D}". The inclusion of class `C` is implied because
-      // it is a subclass of `B`.
-      List<ClassEntity> classes = <ClassEntity>[];
-      forEachStrictSubclassOf(cls1, (ClassEntity subclass) {
-        if (isSubtypeOf(subclass, cls2)) {
-          classes.add(subclass);
-          // Skip subclasses of [subclass]; they all implement [cls2] by
-          // inheritance and are included in the subclasses of [subclass].
-          return IterationStep.SKIP_SUBCLASSES;
-        }
-        return IterationStep.CONTINUE;
-      });
-      return new SubclassResult.subclasses(classes);
-    } else if (query2 == ClassQuery.SUBCLASS) {
-      if (isSubtypeOf(cls2, cls1)) {
-        // The subclasses of [cls2] are all subtypes of [cls1].
-        return new SubclassResult.subclass(cls2);
-      }
-      if (cls2 == _commonElements.objectClass) {
-        // Since [cls2] is `Object` all subtypes of [cls1] are contained within
-        // the subclasses of [cls2].
-        return new SubclassResult.subtype(cls1);
-      }
-      // Find all the root subclasses of [cls2] of that implement [cls1].
-      List<ClassEntity> classes = <ClassEntity>[];
-      forEachStrictSubclassOf(cls2, (ClassEntity subclass) {
-        if (isSubtypeOf(subclass, cls1)) {
-          classes.add(subclass);
-          // Skip subclasses of [subclass]; they all implement [cls1] by
-          // inheritance and are included in the subclasses of [subclass].
-          return IterationStep.SKIP_SUBCLASSES;
-        }
-        return IterationStep.CONTINUE;
-      });
-      return new SubclassResult.subclasses(classes);
-    } else {
-      if (cls1 == cls2 || isSubtypeOf(cls1, cls2)) {
-        // The subtypes of [cls1] are contained within the subtypes of [cls2].
-        return new SubclassResult.subtype(cls1);
-      } else if (isSubtypeOf(cls2, cls1)) {
-        // The subtypes of [cls2] are contained within the subtypes of [cls1].
-        return new SubclassResult.subtype(cls2);
-      }
-      // Find all the root subclasses of [cls1] of that implement [cls2].
-      //
-      // For this hierarchy:
-      //
-      //     class I {}
-      //     class A {}
-      //     class B extends A implements I {}
-      //     class C extends B {}
-      //     class D extends A implements I {}
-      //     class E implements B {}
-      //     class F extends E {}
-      //
-      // the common subclasses of "subtype of A" and "subtype of I" returns
-      // "subclasses of {B, D, E}". The inclusion of classes `C` and `F` is
-      // implied because they are subclasses of `B` and `E`, respectively.
-      List<ClassEntity> classes = <ClassEntity>[];
-      forEachStrictSubtypeOf(cls1, (ClassEntity subclass) {
-        if (isSubtypeOf(subclass, cls2)) {
-          classes.add(subclass);
-          // Skip subclasses of [subclass]; they all implement [cls2] by
-          // inheritance and are included in the subclasses of [subclass].
-          return IterationStep.SKIP_SUBCLASSES;
-        }
-        return IterationStep.CONTINUE;
-      });
-      return new SubclassResult.subclasses(classes);
-    }
-  }
-}
-
-class ClassHierarchyBuilder {
-  // We keep track of subtype and subclass relationships in four
-  // distinct sets to make class hierarchy analysis faster.
-  final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
-      <ClassEntity, ClassHierarchyNode>{};
-  final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
-  final Map<ClassEntity, Set<ClassEntity>> mixinUses =
-      new Map<ClassEntity, Set<ClassEntity>>();
-
-  final CommonElements _commonElements;
-  final ClassQueries _classQueries;
-
-  ClassHierarchyBuilder(this._commonElements, this._classQueries);
-
-  void registerClass(ClassEntity cls) {
-    _ensureClassSet(_classQueries.getDeclaration(cls));
-  }
-
-  ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
-    assert(_classQueries.checkClass(cls));
-    return classHierarchyNodes.putIfAbsent(cls, () {
-      ClassHierarchyNode parentNode;
-      ClassEntity superclass = _classQueries.getSuperClass(cls);
-      if (superclass != null) {
-        parentNode = _ensureClassHierarchyNode(superclass);
-      }
-      return new ClassHierarchyNode(
-          parentNode, cls, _classQueries.getHierarchyDepth(cls));
-    });
-  }
-
-  ClassSet _ensureClassSet(ClassEntity cls) {
-    assert(_classQueries.checkClass(cls));
-    return classSets.putIfAbsent(cls, () {
-      ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
-      ClassSet classSet = new ClassSet(node);
-
-      for (InterfaceType type in _classQueries.getSupertypes(cls)) {
-        // TODO(johnniwinther): Optimization: Avoid adding [cls] to
-        // superclasses.
-        ClassSet subtypeSet = _ensureClassSet(type.element);
-        subtypeSet.addSubtype(node);
-      }
-
-      ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
-      while (appliedMixin != null) {
-        // TODO(johnniwinther): Use the data stored in [ClassSet].
-        registerMixinUse(cls, appliedMixin);
-        ClassSet mixinSet = _ensureClassSet(appliedMixin);
-        mixinSet.addMixinApplication(node);
-
-        // In case of
-        //
-        //    class A {}
-        //    class B = Object with A;
-        //    class C = Object with B;
-        //
-        // we need to register that C not only mixes in B but also A.
-        appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
-      }
-      return classSet;
-    });
-  }
-
-  void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
-    // Ensure that classes implicitly implementing `Function` are in its
-    // subtype set.
-    ClassEntity cls = node.cls;
-    if (cls != _commonElements.functionClass &&
-        _classQueries.implementsFunction(cls)) {
-      ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
-      subtypeSet.addSubtype(node);
-    }
-    if (!node.isInstantiated && node.parentNode != null) {
-      _updateSuperClassHierarchyNodeForClass(node.parentNode);
-    }
-  }
-
-  void updateClassHierarchyNodeForClass(ClassEntity cls,
-      {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
-    ClassHierarchyNode node = _ensureClassSet(cls).node;
-    _updateSuperClassHierarchyNodeForClass(node);
-    if (directlyInstantiated) {
-      node.isDirectlyInstantiated = true;
-    }
-    if (abstractlyInstantiated) {
-      node.isAbstractlyInstantiated = true;
-    }
-  }
-
-  void registerMixinUse(ClassEntity mixinApplication, ClassEntity mixin) {
-    // TODO(johnniwinther): Add map restricted to live classes.
-    // We don't support patch classes as mixin.
-    Set<ClassEntity> users =
-        mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
-    users.add(mixinApplication);
-  }
-
-  bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
-    assert(
-        classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
-    ClassSet classSet = classSets[y];
-    assert(classSet != null,
-        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${classSets}"));
-    ClassHierarchyNode classHierarchyNode = classHierarchyNodes[x];
-    assert(classHierarchyNode != null,
-        failedAt(x, "No ClassHierarchyNode for $x"));
-    return classSet.hasSubtype(classHierarchyNode);
-  }
-
-  bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
-    ClassSet classSet = classSets[x];
-    assert(classSet != null,
-        failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
-
-    if (_isSubtypeOf(x, y)) {
-      // [x] implements [y] itself, possible through supertypes.
-      return true;
-    }
-
-    /// Returns `true` if any live subclass of [node] implements [y].
-    bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
-      return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
-          ClassHierarchyNode.INSTANTIATED,
-          strict: strict);
-    }
-
-    if (subclassImplements(classSet.node, strict: true)) {
-      // A subclass of [x] implements [y].
-      return true;
-    }
-
-    for (ClassHierarchyNode mixinApplication
-        in classSet.mixinApplicationNodes) {
-      if (subclassImplements(mixinApplication, strict: false)) {
-        // A subclass of [mixinApplication] implements [y].
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-abstract class ClassQueries {
-  bool checkClass(covariant ClassEntity cls);
-  bool validateClass(covariant ClassEntity cls);
-
-  /// Returns the declaration of [cls].
-  ClassEntity getDeclaration(covariant ClassEntity cls);
-
-  /// Returns the class mixed into [cls] if any.
-  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
-  // return transitively mixed in classes like in:
-  //     class A {}
-  //     class B = Object with A;
-  //     class C = Object with B;
-  ClassEntity getAppliedMixin(covariant ClassEntity cls);
-
-  /// Returns the hierarchy depth of [cls].
-  int getHierarchyDepth(covariant ClassEntity cls);
-
-  /// Returns `true` if [cls] implements `Function` either explicitly or through
-  /// a `call` method.
-  bool implementsFunction(covariant ClassEntity cls);
-
-  /// Returns the superclass of [cls] if any.
-  ClassEntity getSuperClass(covariant ClassEntity cls);
-
-  /// Returns all supertypes of [cls].
-  Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
-}
-
-/// Enum values defining subset of classes included in queries.
-enum ClassQuery {
-  /// Only the class itself is included.
-  EXACT,
-
-  /// The class and all subclasses (transitively) are included.
-  SUBCLASS,
-
-  /// The class and all classes that implement or subclass it (transitively)
-  /// are included.
-  SUBTYPE,
-}
-
-/// Result computed in [ClassHierarchy.commonSubclasses].
-class SubclassResult {
-  /// The classes in the result set. The classes are always disjoint wrt. the
-  /// interpretation of [query].
-  final List<ClassEntity> classes;
-
-  /// How [classes] should be interpreted: If `ClassQuery.EXACT`, only the
-  /// classes in [classes] are on the result set. If `ClassQuery.SUBCLASS`,
-  /// non-strict subclasses of the classes in [classes] are in the result set.
-  /// If `ClassQuery.SUBTYPE`, non-strict subtypes of the classes in [classes]
-  /// are in the result set.
-  final ClassQuery query;
-
-  /// Creates the empty result set.
-  const SubclassResult.empty()
-      : query = ClassQuery.EXACT,
-        classes = const <ClassEntity>[];
-
-  /// Creates the single set of [cls].
-  SubclassResult.exact(ClassEntity cls)
-      : query = ClassQuery.EXACT,
-        classes = <ClassEntity>[cls];
-
-  /// Creates the set of subclasses of [cls].
-  SubclassResult.subclass(ClassEntity cls)
-      : query = ClassQuery.SUBCLASS,
-        classes = <ClassEntity>[cls];
-
-  /// Creates the set of subtypes of [cls].
-  SubclassResult.subtype(ClassEntity cls)
-      : query = ClassQuery.SUBTYPE,
-        classes = <ClassEntity>[cls];
-
-  /// Creates the set of classes that are subclasses of a class in [classes].
-  SubclassResult.subclasses(this.classes) : query = ClassQuery.SUBCLASS;
-
-  SubclassResult.internal(this.query, this.classes);
-
-  String toString() => 'SubclassResult($query,$classes)';
-}
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart b/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
new file mode 100644
index 0000000..337975f
--- /dev/null
+++ b/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
@@ -0,0 +1,181 @@
+// 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 '../common.dart';
+import '../common_elements.dart';
+import '../elements/entities.dart';
+import '../elements/types.dart' show InterfaceType;
+import 'class_set.dart';
+
+class ClassHierarchyBuilder {
+  // We keep track of subtype and subclass relationships in four
+  // distinct sets to make class hierarchy analysis faster.
+  final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
+      <ClassEntity, ClassHierarchyNode>{};
+  final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
+  final Map<ClassEntity, Set<ClassEntity>> mixinUses =
+      new Map<ClassEntity, Set<ClassEntity>>();
+
+  final CommonElements _commonElements;
+  final ClassQueries _classQueries;
+
+  ClassHierarchyBuilder(this._commonElements, this._classQueries);
+
+  void registerClass(ClassEntity cls) {
+    _ensureClassSet(_classQueries.getDeclaration(cls));
+  }
+
+  ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
+    assert(_classQueries.checkClass(cls));
+    return classHierarchyNodes.putIfAbsent(cls, () {
+      ClassHierarchyNode parentNode;
+      ClassEntity superclass = _classQueries.getSuperClass(cls);
+      if (superclass != null) {
+        parentNode = _ensureClassHierarchyNode(superclass);
+      }
+      return new ClassHierarchyNode(
+          parentNode, cls, _classQueries.getHierarchyDepth(cls));
+    });
+  }
+
+  ClassSet _ensureClassSet(ClassEntity cls) {
+    assert(_classQueries.checkClass(cls));
+    return classSets.putIfAbsent(cls, () {
+      ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
+      ClassSet classSet = new ClassSet(node);
+
+      for (InterfaceType type in _classQueries.getSupertypes(cls)) {
+        // TODO(johnniwinther): Optimization: Avoid adding [cls] to
+        // superclasses.
+        ClassSet subtypeSet = _ensureClassSet(type.element);
+        subtypeSet.addSubtype(node);
+      }
+
+      ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
+      while (appliedMixin != null) {
+        // TODO(johnniwinther): Use the data stored in [ClassSet].
+        registerMixinUse(cls, appliedMixin);
+        ClassSet mixinSet = _ensureClassSet(appliedMixin);
+        mixinSet.addMixinApplication(node);
+
+        // In case of
+        //
+        //    class A {}
+        //    class B = Object with A;
+        //    class C = Object with B;
+        //
+        // we need to register that C not only mixes in B but also A.
+        appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
+      }
+      return classSet;
+    });
+  }
+
+  void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
+    // Ensure that classes implicitly implementing `Function` are in its
+    // subtype set.
+    ClassEntity cls = node.cls;
+    if (cls != _commonElements.functionClass &&
+        _classQueries.implementsFunction(cls)) {
+      ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
+      subtypeSet.addSubtype(node);
+    }
+    if (!node.isInstantiated && node.parentNode != null) {
+      _updateSuperClassHierarchyNodeForClass(node.parentNode);
+    }
+  }
+
+  void updateClassHierarchyNodeForClass(ClassEntity cls,
+      {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
+    ClassHierarchyNode node = _ensureClassSet(cls).node;
+    _updateSuperClassHierarchyNodeForClass(node);
+    if (directlyInstantiated) {
+      node.isDirectlyInstantiated = true;
+    }
+    if (abstractlyInstantiated) {
+      node.isAbstractlyInstantiated = true;
+    }
+  }
+
+  void registerMixinUse(ClassEntity mixinApplication, ClassEntity mixin) {
+    // TODO(johnniwinther): Add map restricted to live classes.
+    // We don't support patch classes as mixin.
+    Set<ClassEntity> users =
+        mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
+    users.add(mixinApplication);
+  }
+
+  bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
+    assert(
+        classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
+    ClassSet classSet = classSets[y];
+    assert(classSet != null,
+        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${classSets}"));
+    ClassHierarchyNode classHierarchyNode = classHierarchyNodes[x];
+    assert(classHierarchyNode != null,
+        failedAt(x, "No ClassHierarchyNode for $x"));
+    return classSet.hasSubtype(classHierarchyNode);
+  }
+
+  bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
+    ClassSet classSet = classSets[x];
+    assert(classSet != null,
+        failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
+
+    if (_isSubtypeOf(x, y)) {
+      // [x] implements [y] itself, possible through supertypes.
+      return true;
+    }
+
+    /// Returns `true` if any live subclass of [node] implements [y].
+    bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
+      return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
+          ClassHierarchyNode.INSTANTIATED,
+          strict: strict);
+    }
+
+    if (subclassImplements(classSet.node, strict: true)) {
+      // A subclass of [x] implements [y].
+      return true;
+    }
+
+    for (ClassHierarchyNode mixinApplication
+        in classSet.mixinApplicationNodes) {
+      if (subclassImplements(mixinApplication, strict: false)) {
+        // A subclass of [mixinApplication] implements [y].
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+abstract class ClassQueries {
+  bool checkClass(covariant ClassEntity cls);
+  bool validateClass(covariant ClassEntity cls);
+
+  /// Returns the declaration of [cls].
+  ClassEntity getDeclaration(covariant ClassEntity cls);
+
+  /// Returns the class mixed into [cls] if any.
+  // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
+  // return transitively mixed in classes like in:
+  //     class A {}
+  //     class B = Object with A;
+  //     class C = Object with B;
+  ClassEntity getAppliedMixin(covariant ClassEntity cls);
+
+  /// Returns the hierarchy depth of [cls].
+  int getHierarchyDepth(covariant ClassEntity cls);
+
+  /// Returns `true` if [cls] implements `Function` either explicitly or through
+  /// a `call` method.
+  bool implementsFunction(covariant ClassEntity cls);
+
+  /// Returns the superclass of [cls] if any.
+  ClassEntity getSuperClass(covariant ClassEntity cls);
+
+  /// Returns all supertypes of [cls].
+  Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
+}
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index dc49fe5..fecaed8 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -304,12 +304,10 @@
     Selector selector = dynamicUse.selector;
     String name = selector.name;
     Object constraint = dynamicUse.receiverConstraint;
-    Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
-        name, () => new Maplet<Selector, SelectorConstraints>());
-    UniverseSelectorConstraints constraints =
-        selectors.putIfAbsent(selector, () {
-      return selectorConstraintsStrategy.createSelectorConstraints(selector);
-    });
+    Map<Selector, SelectorConstraints> selectors =
+        selectorMap[name] ??= new Maplet<Selector, SelectorConstraints>();
+    UniverseSelectorConstraints constraints = selectors[selector] ??=
+        selectorConstraintsStrategy.createSelectorConstraints(selector);
     return constraints.addReceiverConstraint(constraint);
   }
 
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index aee80f5..5f78a8e 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.dart
@@ -20,7 +20,7 @@
     Map<String, FunctionSetNode> nodes = new Map<String, FunctionSetNode>();
     for (MemberEntity member in liveInstanceMembers) {
       String name = member.name;
-      nodes.putIfAbsent(name, () => new FunctionSetNode(name)).add(member);
+      (nodes[name] ??= new FunctionSetNode(name)).add(member);
     }
     return new FunctionSet.internal(nodes);
   }
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 2417fd3..c1bf88d 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -28,7 +28,7 @@
 import '../util/enumset.dart';
 import '../util/util.dart';
 import '../world.dart' show World, JClosedWorld, KClosedWorld, OpenWorld;
-import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
+import 'class_hierarchy_builder.dart' show ClassHierarchyBuilder, ClassQueries;
 import 'selector.dart' show Selector;
 import 'use.dart'
     show
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index d440deb..2a33f49 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -23,7 +23,6 @@
 import 'ordered_typeset.dart';
 import 'options.dart';
 import 'types/abstract_value_domain.dart';
-import 'universe/class_hierarchy.dart';
 import 'universe/class_set.dart';
 import 'universe/function_set.dart' show FunctionSet;
 import 'universe/selector.dart' show Selector;
@@ -69,8 +68,6 @@
 
   Iterable<MemberEntity> get processedMembers;
 
-  ClassHierarchy get classHierarchy;
-
   /// Returns `true` if [cls] is either directly or indirectly instantiated.
   bool isInstantiated(ClassEntity cls);
 
@@ -175,6 +172,27 @@
   /// Returns an iterable over the common supertypes of the [classes].
   Iterable<ClassEntity> commonSupertypesOf(Iterable<ClassEntity> classes);
 
+  /// Returns an iterable of the classes that are contained in the
+  /// strict subclass/subtype sets of both [cls1] and [cls2].
+  ///
+  /// Classes that are implied by included superclasses/supertypes are not
+  /// returned.
+  ///
+  /// For instance for this hierarchy
+  ///
+  ///     class A {}
+  ///     class B {}
+  ///     class C implements A, B {}
+  ///     class D extends C {}
+  ///
+  /// the query
+  ///
+  ///     commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
+  ///
+  /// return the set {C} because [D] is implied by [C].
+  Iterable<ClassEntity> commonSubclasses(
+      ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
+
   /// Returns an iterable over the live mixin applications that mixin [cls].
   Iterable<ClassEntity> mixinUsesOf(ClassEntity cls);
 
@@ -337,6 +355,19 @@
   bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type);
 }
 
+/// Enum values defining subset of classes included in queries.
+enum ClassQuery {
+  /// Only the class itself is included.
+  EXACT,
+
+  /// The class and all subclasses (transitively) are included.
+  SUBCLASS,
+
+  /// The class and all classes that implement or subclass it (transitively)
+  /// are included.
+  SUBTYPE,
+}
+
 abstract class ClosedWorldBase implements JClosedWorld {
   final ConstantSystem constantSystem;
   final NativeData nativeData;
@@ -373,8 +404,6 @@
 
   final Iterable<MemberEntity> processedMembers;
 
-  final ClassHierarchy classHierarchy;
-
   ClosedWorldBase(
       this.elementEnvironment,
       this.dartTypes,
@@ -396,9 +425,7 @@
       AbstractValueStrategy abstractValueStrategy)
       : this._implementedClasses = implementedClasses,
         this._classHierarchyNodes = classHierarchyNodes,
-        this._classSets = classSets,
-        classHierarchy = new ClassHierarchyImpl(
-            commonElements, classHierarchyNodes, classSets) {}
+        this._classSets = classSets {}
 
   bool checkEntity(covariant Entity element);
 
@@ -638,6 +665,27 @@
     return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null;
   }
 
+  Set<ClassEntity> _commonContainedClasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    Iterable<ClassEntity> xSubset = _containedSubset(cls1, query1);
+    if (xSubset == null) return null;
+    Iterable<ClassEntity> ySubset = _containedSubset(cls2, query2);
+    if (ySubset == null) return null;
+    return xSubset.toSet().intersection(ySubset.toSet());
+  }
+
+  Iterable<ClassEntity> _containedSubset(ClassEntity cls, ClassQuery query) {
+    switch (query) {
+      case ClassQuery.EXACT:
+        return null;
+      case ClassQuery.SUBCLASS:
+        return strictSubclassesOf(cls);
+      case ClassQuery.SUBTYPE:
+        return strictSubtypesOf(cls);
+    }
+    throw new ArgumentError('Unexpected query: $query.');
+  }
+
   /// Returns `true` if [cls] is mixed into a live class.
   bool isUsedAsMixin(ClassEntity cls) {
     return !mixinUsesOf(cls).isEmpty;
@@ -761,6 +809,38 @@
     return commonSupertypes;
   }
 
+  Iterable<ClassEntity> commonSubclasses(ClassEntity cls1, ClassQuery query1,
+      ClassEntity cls2, ClassQuery query2) {
+    // TODO(johnniwinther): Use [ClassSet] to compute this.
+    // Compute the set of classes that are contained in both class subsets.
+    Set<ClassEntity> common =
+        _commonContainedClasses(cls1, query1, cls2, query2);
+    if (common == null || common.isEmpty) return const <ClassEntity>[];
+    // Narrow down the candidates by only looking at common classes
+    // that do not have a superclass or supertype that will be a
+    // better candidate.
+    return common.where((ClassEntity each) {
+      bool containsSuperclass = common.contains(getSuperClass(each));
+      // If the superclass is also a candidate, then we don't want to
+      // deal with this class. If we're only looking for a subclass we
+      // know we don't have to look at the list of interfaces because
+      // they can never be in the common set.
+      if (containsSuperclass ||
+          query1 == ClassQuery.SUBCLASS ||
+          query2 == ClassQuery.SUBCLASS) {
+        return !containsSuperclass;
+      }
+      // Run through the direct supertypes of the class. If the common
+      // set contains the direct supertype of the class, we ignore the
+      // the class because the supertype is a better candidate.
+
+      for (ClassEntity interface in getInterfaces(each)) {
+        if (common.contains(interface)) return false;
+      }
+      return true;
+    });
+  }
+
   /// Returns an iterable over the live mixin applications that mixin [cls].
   Iterable<ClassEntity> mixinUsesOf(ClassEntity cls) {
     if (_liveMixinUses == null) {
@@ -957,11 +1037,23 @@
   InterceptorData get interceptorData;
   ElementEnvironment get elementEnvironment;
   CommonElements get commonElements;
-  ClassHierarchy get classHierarchy;
 
   /// Returns `true` if [cls] is implemented by an instantiated class.
   bool isImplemented(ClassEntity cls);
 
+  /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
+  /// of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
+
+  /// Returns [ClassSet] for [cls] used to model the extends and implements
+  /// relations of known classes.
+  ///
+  /// This method is only provided for testing. For queries on classes, use the
+  /// methods defined in [JClosedWorld].
+  ClassSet getClassSet(ClassEntity cls);
   Iterable<MemberEntity> get liveInstanceMembers;
   Map<ClassEntity, Set<ClassEntity>> get mixinUses;
   Map<ClassEntity, Set<ClassEntity>> get typesImplementedBySubclasses;
@@ -973,4 +1065,42 @@
   Iterable<MemberEntity> get processedMembers;
   RuntimeTypesNeed get rtiNeed;
   NoSuchMethodData get noSuchMethodData;
+
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassEntity x, ClassEntity y);
+
+  /// Returns an iterable of the classes that are contained in the
+  /// strict subclass/subtype sets of both [cls1] and [cls2].
+  ///
+  /// Classes that are implied by included superclasses/supertypes are not
+  /// returned.
+  ///
+  /// For instance for this hierarchy
+  ///
+  ///     class A {}
+  ///     class B {}
+  ///     class C implements A, B {}
+  ///     class D extends C {}
+  ///
+  /// the query
+  ///
+  ///     commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
+  ///
+  /// return the set {C} because [D] is implied by [C].
+  Iterable<ClassEntity> commonSubclasses(
+      ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
+
+  /// Returns an iterable over the directly instantiated that implement [cls]
+  /// possibly including [cls] itself, if it is live.
+  Iterable<ClassEntity> subtypesOf(ClassEntity cls);
+
+  /// Returns an iterable over the live classes that extend [cls] including
+  /// [cls] itself.
+  Iterable<ClassEntity> subclassesOf(ClassEntity cls);
+
+  /// Applies [f] to each live class that implements [cls] _not_ including [cls]
+  /// itself.
+  void forEachStrictSubtypeOf(
+      ClassEntity cls, IterationStep f(ClassEntity cls));
 }
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 c72cfab..7065b1b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2495,7 +2495,7 @@
         if (receiver is LargeIntAccessGenerator) {
           int value = int.tryParse("-" + receiver.token.lexeme);
           if (value != null) {
-            receiverValue = forest.literalInt(value, token);
+            receiverValue = forest.literalInt(value, receiver.token);
             if (errorOnUnexactWebIntLiterals) {
               checkWebIntLiteralsErrorIfUnexact(value, token);
             }
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 930a322..ebb64ec 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
@@ -432,6 +432,49 @@
     cloned.parent = cls;
   }
 
+  void addNoSuchMethodForwarderGetterForField(Member noSuchMethod,
+      KernelTarget target, Field field, ClassHierarchy hierarchy) {
+    Substitution substitution = Substitution.fromSupertype(
+        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
+    Procedure getter = new Procedure(
+        field.name,
+        ProcedureKind.Getter,
+        new FunctionNode(null,
+            typeParameters: <TypeParameter>[],
+            positionalParameters: <VariableDeclaration>[],
+            namedParameters: <VariableDeclaration>[],
+            requiredParameterCount: 0,
+            returnType: substitution.substituteType(field.type)),
+        fileUri: field.fileUri)
+      ..fileOffset = field.fileOffset;
+    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, getter);
+    cls.procedures.add(getter);
+    getter.parent = cls;
+  }
+
+  void addNoSuchMethodForwarderSetterForField(Member noSuchMethod,
+      KernelTarget target, Field field, ClassHierarchy hierarchy) {
+    Substitution substitution = Substitution.fromSupertype(
+        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
+    Procedure setter = new Procedure(
+        field.name,
+        ProcedureKind.Setter,
+        new FunctionNode(null,
+            typeParameters: <TypeParameter>[],
+            positionalParameters: <VariableDeclaration>[
+              new VariableDeclaration("value",
+                  type: substitution.substituteType(field.type))
+            ],
+            namedParameters: <VariableDeclaration>[],
+            requiredParameterCount: 1,
+            returnType: const VoidType()),
+        fileUri: field.fileUri)
+      ..fileOffset = field.fileOffset;
+    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, setter);
+    cls.procedures.add(setter);
+    setter.parent = cls;
+  }
+
   /// Adds noSuchMethod forwarding stubs to this class. Returns `true` if the
   /// class was modified.
   bool addNoSuchMethodForwarders(
@@ -492,6 +535,14 @@
         existingForwardersNames.add(member.name);
         changed = true;
       }
+      if (member is Field &&
+          ClassHierarchy.findMemberByName(concrete, member.name) == null &&
+          !existingForwardersNames.contains(member.name)) {
+        addNoSuchMethodForwarderGetterForField(
+            noSuchMethod, target, member, hierarchy);
+        existingForwardersNames.add(member.name);
+        changed = true;
+      }
     }
 
     List<Member> concreteSetters =
@@ -514,6 +565,15 @@
         existingSetterForwardersNames.add(member.name);
         changed = true;
       }
+      if (member is Field &&
+          ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
+              null &&
+          !existingSetterForwardersNames.contains(member.name)) {
+        addNoSuchMethodForwarderSetterForField(
+            noSuchMethod, target, member, hierarchy);
+        existingSetterForwardersNames.add(member.name);
+        changed = true;
+      }
     }
 
     return changed;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index c4b13df..a842348 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -830,8 +830,8 @@
           fileOffset,
           noLength);
     }
-    inferrer.listener
-        .constructorInvocation(this, fileOffset, target, inferredType);
+    inferrer.listener.constructorInvocation(
+        this, argumentJudgments.fileOffset, target, inferredType);
 
     if (isRedirected(this)) {
       InterfaceType returnType = inferredType;
@@ -1071,8 +1071,8 @@
         argumentJudgments);
     var inferredType = inferenceResult.type;
     this.inferredType = inferredType;
-    inferrer.listener
-        .constructorInvocation(this, fileOffset, target, inferredType);
+    inferrer.listener.constructorInvocation(
+        this, argumentJudgments.fileOffset, target, inferredType);
 
     if (isRedirected(this)) {
       InterfaceType returnType = inferredType;
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 6178e4b..3b8f651 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -4079,21 +4079,17 @@
   /// This is a suffix parser because it is assumed that type arguments have
   /// been parsed, or `listener.handleNoTypeArguments(..)` has been executed.
   Token parseLiteralFunctionSuffix(Token token) {
-    Token next = token.next;
-    assert(optional('(', next));
-    Token closeBrace = next.endGroup;
-    if (closeBrace != null) {
-      Token nextToken = closeBrace.next;
-      int kind = nextToken.kind;
-      if (identical(kind, FUNCTION_TOKEN) ||
-          identical(kind, OPEN_CURLY_BRACKET_TOKEN) ||
-          (identical(kind, KEYWORD_TOKEN) &&
-              (optional('async', nextToken) || optional('sync', nextToken)))) {
-        return parseFunctionExpression(token);
-      }
-      // Fall through.
+    assert(optional('(', token.next));
+    // Scanner ensures `(` has matching `)`.
+    Token next = token.next.endGroup.next;
+    int kind = next.kind;
+    if (!identical(kind, FUNCTION_TOKEN) &&
+        !identical(kind, OPEN_CURLY_BRACKET_TOKEN) &&
+        (!identical(kind, KEYWORD_TOKEN) ||
+            !optional('async', next) && !optional('sync', next))) {
+      reportRecoverableErrorWithToken(next, fasta.templateUnexpectedToken);
     }
-    return reportUnexpectedToken(next);
+    return parseFunctionExpression(token);
   }
 
   /// genericListLiteral | genericMapLiteral | genericFunctionLiteral.
@@ -4105,25 +4101,31 @@
   ///   genericFunctionLiteral ::=
   ///       typeParameters formalParameterList functionBody
   /// Provide token for [constKeyword] if preceded by 'const', null if not.
-  Token parseLiteralListOrMapOrFunction(Token token, Token constKeyword) {
+  Token parseLiteralListOrMapOrFunction(final Token start, Token constKeyword) {
+    assert(optional('<', start.next));
+    TypeParamOrArgInfo typeParamOrArg = computeTypeParamOrArg(start, true);
+    Token token = typeParamOrArg.skip(start);
     Token next = token.next;
-    assert(optional('<', next));
-    Token closeBrace = next.endGroup;
-    if (constKeyword == null &&
-        closeBrace != null &&
-        identical(closeBrace.next.kind, OPEN_PAREN_TOKEN)) {
-      token = computeTypeParamOrArg(token).parseVariables(token, this);
-      return parseLiteralFunctionSuffix(token);
-    } else {
-      token = computeTypeParamOrArg(token).parseArguments(token, this);
-      Token next = token.next;
-      if (optional('{', next)) {
-        return parseLiteralMapSuffix(token, constKeyword);
-      } else if ((optional('[', next)) || (optional('[]', next))) {
-        return parseLiteralListSuffix(token, constKeyword);
+    if (optional('(', next)) {
+      if (constKeyword != null) {
+        reportRecoverableErrorWithToken(
+            constKeyword, fasta.templateUnexpectedToken);
       }
-      return reportUnexpectedToken(token.next);
+      token = typeParamOrArg.parseVariables(start, this);
+      return parseLiteralFunctionSuffix(token);
     }
+    token = typeParamOrArg.parseArguments(start, this);
+    if (optional('{', next)) {
+      return parseLiteralMapSuffix(token, constKeyword);
+    }
+    if (!optional('[', next) && !optional('[]', next)) {
+      // TODO(danrubel): Improve this error message.
+      reportRecoverableError(
+          next, fasta.templateExpectedButGot.withArguments('['));
+      rewriter.insertTokenAfter(
+          token, new SyntheticToken(TokenType.INDEX, next.charOffset));
+    }
+    return parseLiteralListSuffix(token, constKeyword);
   }
 
   /// ```
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 9a1a945..8d05a29 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
@@ -603,9 +603,12 @@
       assert(optional('>', endGroup) || optional('>>', endGroup));
       // If `>>`, then the end or last consumed token is the token before `>>`.
       end = optional('>>', next) ? token : next;
-    } else if (inDeclaration && start.endGroup == null) {
-      // Recovery: Unbalanced `<`
-      end = token;
+    } else if (inDeclaration) {
+      end = start.endGroup;
+      if (end == null) {
+        // Recovery: Unbalanced `<`
+        end = token;
+      }
     } else {
       return noTypeParamOrArg;
     }
@@ -614,6 +617,7 @@
 
   @override
   Token parseArguments(Token token, Parser parser) {
+    assert(identical(token.next, start));
     Token next = start;
     Token innerEndGroup = processBeginGroup(start, parser);
     parser.listener.beginTypeArguments(start);
@@ -654,6 +658,7 @@
 
   @override
   Token parseVariables(Token token, Parser parser) {
+    assert(identical(token.next, start));
     Token next = start;
     Listener listener = parser.listener;
     listener.beginTypeVariables(start);
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 e414ffe5..9805fbf 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
@@ -832,8 +832,38 @@
     setters.length = candidates.length;
     int getterIndex = 0;
     int setterIndex = 0;
+    // To detect conflicts between instance members (possibly inherited ones)
+    // and static members, use a map from names to lists of members.  There can
+    // be more than one static member with a given name, e.g., if there is a
+    // getter and a setter.  We will report both conflicts.
+    Map<Name, List<Member>> staticMembers = {};
+    for (var procedure in class_.procedures) {
+      if (procedure.isStatic) {
+        staticMembers.putIfAbsent(procedure.name, () => []).add(procedure);
+      }
+    }
+    for (var field in class_.fields) {
+      if (field.isStatic) {
+        staticMembers.putIfAbsent(field.name, () => []).add(field);
+      }
+    }
     forEachApiMember(candidates, (int start, int end, Name name) {
       Procedure member = candidates[start];
+      // We should not have a method, getter, or setter in our interface that
+      // conflicts with a static method, getter, or setter declared in the
+      // class.
+      List<Member> conflicts = staticMembers[name];
+      if (conflicts != null) {
+        for (var conflict in conflicts) {
+          library.addProblem(messageDeclaredMemberConflictsWithInheritedMember,
+              conflict.fileOffset, noLength, conflict.fileUri,
+              context: [
+                messageDeclaredMemberConflictsWithInheritedMemberCause
+                    .withLocation(member.fileUri, member.fileOffset, noLength)
+              ]);
+        }
+        return;
+      }
       ProcedureKind kind = _kindOf(member);
       if (kind != ProcedureKind.Getter && kind != ProcedureKind.Setter) {
         for (int i = start + 1; i < end; ++i) {
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index dd18315..41420c9 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -1,7 +1,7 @@
 name: front_end
 # Currently, front_end API is not stable and users should not
 # depend on semver semantics when depending on this package.
-version: 0.1.1
+version: 0.1.2
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
@@ -11,7 +11,7 @@
   charcode: '^1.1.1'
   convert: '^2.0.1'
   crypto: '^2.0.2'
-  kernel: 0.3.1
+  kernel: 0.3.2
   meta: '^1.1.1'
   package_config: '^1.0.1'
   path: '^1.3.9'
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart
new file mode 100644
index 0000000..fdaad64
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.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.
+
+// This test checks that noSuchMethod forwarders are generated for abstract
+// accessors implicitly declared via fields of abstract classes.  The type
+// checks should be performed for the return values of getters and for the r.h.s
+// of assignments for setters.
+
+void expectTypeError(callback()) {
+  try {
+    callback();
+    throw 'Expected TypeError, did not occur';
+  } on TypeError {}
+}
+
+abstract class I {
+  int foo;
+}
+
+class A implements I {
+  dynamic noSuchMethod(i) => "bar";
+
+  // Should have noSuchMethod forwarders for the 'foo' getter and setter.
+}
+
+class B extends A {
+  // Should not have noSuchMethod forwarders for the 'foo' getter and setter.
+}
+
+main() {
+  var a = new A();
+  expectTypeError(() => a.foo);
+  expectTypeError(() => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect
new file mode 100644
index 0000000..4715ca5
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic a = new self::A::•();
+  self::expectTypeError(() → dynamic => a.foo);
+  self::expectTypeError(() → dynamic => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect
new file mode 100644
index 0000000..4715ca5
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic a = new self::A::•();
+  self::expectTypeError(() → dynamic => a.foo);
+  self::expectTypeError(() → dynamic => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
new file mode 100644
index 0000000..4a9cf68
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo;
+  synthetic constructor •() → void
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect
new file mode 100644
index 0000000..178f196
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::A a = new self::A::•();
+  self::expectTypeError(() → core::int => a.{self::A::foo});
+  self::expectTypeError(() → core::String => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect
new file mode 100644
index 0000000..178f196
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+class B extends self::A {
+  synthetic constructor •() → void
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::A a = new self::A::•();
+  self::expectTypeError(() → core::int => a.{self::A::foo});
+  self::expectTypeError(() → core::String => (a as dynamic).foo = "bar");
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart
new file mode 100644
index 0000000..cebe1ac
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart
@@ -0,0 +1,40 @@
+// 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 checks that noSuchMethod forwarders that were generated for
+// abstract accessors declared via field in an interface don't override concrete
+// getters and setters in the mixin application.
+
+int count = 0;
+
+abstract class A {
+  int foo;
+}
+
+class B implements A {
+  noSuchMethod(i) {
+    ++count;
+    return null;
+  }
+
+  // Should receive noSuchMethod forwarders for the 'foo' getter and setter.
+}
+
+class C extends Object with B {
+  // The getter and the setter below shouldn't be overridden with noSuchMethod
+  // forwarders.
+  int get foo => 42;
+  void set foo(int value) {}
+}
+
+main() {
+  var c = new C();
+  if (c.foo != 42) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.foo = 43;
+  if (count != 0) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
new file mode 100644
index 0000000..b5697c5
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B = core::Object with self::B {
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  if(!c.foo.==(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.foo = 43;
+  if(!self::count.==(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
new file mode 100644
index 0000000..dba219d
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B extends core::Object implements self::B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  if(!c.foo.==(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.foo = 43;
+  if(!self::count.==(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
new file mode 100644
index 0000000..ec76229
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo;
+  synthetic constructor •() → void
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B = core::Object with self::B {
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    ;
+  get foo() → core::int
+    ;
+  set foo(core::int value) → void
+    ;
+}
+static field core::int count;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
new file mode 100644
index 0000000..953a669
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    self::count = self::count.{core::num::+}(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B = core::Object with self::B {
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  if(!c.{self::C::foo}.{core::num::==}(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.{self::C::foo} = 43;
+  if(!self::count.{core::num::==}(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
new file mode 100644
index 0000000..ab758a7
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    self::count = self::count.{core::num::+}(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class _C&Object&B extends core::Object implements self::B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    self::count = self::count.{core::num::+}(1);
+    return null;
+  }
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  if(!c.{self::C::foo}.{core::num::==}(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.{self::C::foo} = 43;
+  if(!self::count.{core::num::==}(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart
new file mode 100644
index 0000000..74d8dee
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart
@@ -0,0 +1,48 @@
+// 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 checks that noSuchMethod forwarders are generated for abstract
+// accessors implicitly declared via fields of abstract classes in case when one
+// of the accessors is defined in a superclass.
+
+void expectTypeError(callback()) {
+  try {
+    callback();
+    throw 'Expected TypeError, did not occur';
+  } on TypeError {}
+}
+
+abstract class A {
+  int foo;
+}
+
+abstract class B implements A {
+  int get foo => 42;
+
+  noSuchMethod(i) => "bar";
+}
+
+class C extends B {
+  // Should receive a noSuchMethod forwarder for the 'foo' setter, but not for
+  // the 'foo' getter.
+}
+
+abstract class D implements A {
+  void set foo(int value) {}
+
+  noSuchMethod(i) => "bar";
+}
+
+class E extends D {
+  // Should receive a noSuchMethod forwarder for the 'foo' getter, but not for
+  // the 'foo' setter.
+}
+
+main() {
+  var c = new C();
+  expectTypeError(() => (c as dynamic).foo = "bar");
+
+  var e = new E();
+  expectTypeError(() => e.foo);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect
new file mode 100644
index 0000000..4f01365
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  self::expectTypeError(() → dynamic => (c as dynamic).foo = "bar");
+  dynamic e = new self::E::•();
+  self::expectTypeError(() → dynamic => e.foo);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect
new file mode 100644
index 0000000..4f01365
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+  method noSuchMethod(dynamic i) → dynamic
+    return "bar";
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  self::expectTypeError(() → dynamic => (c as dynamic).foo = "bar");
+  dynamic e = new self::E::•();
+  self::expectTypeError(() → dynamic => e.foo);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
new file mode 100644
index 0000000..02d4667
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo;
+  synthetic constructor •() → void
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    ;
+  get foo() → core::int
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    ;
+  set foo(core::int value) → void
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect
new file mode 100644
index 0000000..43a4429
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  self::expectTypeError(() → core::String => (c as dynamic).foo = "bar");
+  self::E e = new self::E::•();
+  self::expectTypeError(() → core::int => e.{self::E::foo});
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect
new file mode 100644
index 0000000..43a4429
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+}
+class C extends self::B {
+  synthetic constructor •() → void
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+  method noSuchMethod(core::Invocation i) → dynamic
+    return "bar";
+}
+class E extends self::D {
+  synthetic constructor •() → void
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::int;
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::C c = new self::C::•();
+  self::expectTypeError(() → core::String => (c as dynamic).foo = "bar");
+  self::E e = new self::E::•();
+  self::expectTypeError(() → core::int => e.{self::E::foo});
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart
new file mode 100644
index 0000000..8b3cd2c
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that noSuchMethod forwarders that are generated for abstract
+// accessors synthesized from a field of an interface have the proper type
+// substitution performed on the types of their parameters and on the return
+// type.
+
+void expectTypeError(callback()) {
+  try {
+    callback();
+    throw 'Expected TypeError, did not occur';
+  } on TypeError {}
+}
+
+abstract class A<X> {
+  List<X> foo;
+}
+
+class B implements A<int> {
+  dynamic noSuchMethod(i) => <dynamic>[];
+
+  // The noSuchMethod forwarder for the getter should return `List<int>`.
+
+  // The noSuchMethod forwarder for the setter should take `List<int>`.
+}
+
+main() {
+  var b = new B();
+  expectTypeError(() => b.foo);
+  expectTypeError(() => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect
new file mode 100644
index 0000000..232606c
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  field core::List<self::A::X> foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    return <dynamic>[];
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic b = new self::B::•();
+  self::expectTypeError(() → dynamic => b.foo);
+  self::expectTypeError(() → dynamic => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect
new file mode 100644
index 0000000..232606c
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  field core::List<self::A::X> foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    return <dynamic>[];
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  dynamic b = new self::B::•();
+  self::expectTypeError(() → dynamic => b.foo);
+  self::expectTypeError(() → dynamic => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
new file mode 100644
index 0000000..8d22954
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  field core::List<self::A::X> foo;
+  synthetic constructor •() → void
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    ;
+  method noSuchMethod(dynamic i) → dynamic
+    ;
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
new file mode 100644
index 0000000..3b8a767
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X> foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return <dynamic>[];
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::B b = new self::B::•();
+  self::expectTypeError(() → core::List<core::int> => b.{self::B::foo});
+  self::expectTypeError(() → core::List<dynamic> => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
new file mode 100644
index 0000000..3b8a767
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X> foo = null;
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A<core::int> {
+  synthetic constructor •() → void
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return <dynamic>[];
+  no-such-method-forwarder get foo() → core::List<core::int>
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("get:foo", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} core::List<core::int>;
+  no-such-method-forwarder set foo(core::List<core::int> value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withoutType("set:foo", const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false));
+}
+static method expectTypeError(() → dynamic callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::B b = new self::B::•();
+  self::expectTypeError(() → core::List<core::int> => b.{self::B::foo});
+  self::expectTypeError(() → core::List<dynamic> => (b as dynamic).foo = <dynamic>[]);
+}
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index ac6ca9c2..651c83e5 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -1,7 +1,7 @@
 name: kernel
 # Currently, kernel API is not stable and users should
 # not depend on semver semantics when depending on this package.
-version: 0.3.1
+version: 0.3.2
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
@@ -14,7 +14,7 @@
   package_config: ^1.0.0
 dev_dependencies:
   analyzer: '>=0.31.0 <0.33.0'
-  front_end: 0.1.1
+  front_end: 0.1.2
   test: ^0.12.15+6
   stack_trace: ^1.6.6
   test_reflective_loader: ^0.1.0
diff --git a/pkg/pkg.status b/pkg/pkg.status
index cd5cb27..5e11bee 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -151,6 +151,9 @@
 [ $no_preview_dart_2 ]
 dev_compiler/*: SkipByDesign # uses Dart 2.
 
+[ !$preview_dart_2 ]
+smith/test/*: Skip # Uses optional new.
+
 [ $arch == x64 && $runtime == vm && $system == windows && $checked ]
 analyzer/test/src/task/strong/inferred_type_test: Pass, Slow
 
@@ -167,8 +170,9 @@
 analysis_server/test/services/correction/fix_test: Fail
 analysis_server/test/services/refactoring/extract_local_test: Fail
 analyzer/test/generated/compile_time_error_code_driver_test: Fail
+analyzer/test/generated/compile_time_error_code_kernel_test: Fail
+analyzer/test/generated/compile_time_error_code_kernel_test.dart: Fail
 analyzer/test/generated/compile_time_error_code_test: Fail
-analyzer/test/generated/hint_code_driver_test: Fail
 analyzer/test/generated/invalid_code_driver_test: Fail
 analyzer/test/generated/non_error_resolver_driver_test: Fail
 analyzer/test/generated/non_error_resolver_test: Fail
diff --git a/pkg/smith/analysis_options.yaml b/pkg/smith/analysis_options.yaml
new file mode 100644
index 0000000..1a46de2
--- /dev/null
+++ b/pkg/smith/analysis_options.yaml
@@ -0,0 +1,3 @@
+analyzer:
+  strong-mode:
+    implicit-casts: false
diff --git a/pkg/smith/bin/print_configurations.dart b/pkg/smith/bin/print_configurations.dart
new file mode 100644
index 0000000..38b175d
--- /dev/null
+++ b/pkg/smith/bin/print_configurations.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'package:smith/smith.dart';
+
+/// A rudimentary script to print the configurations in the given test matrix
+/// file.
+void main(List<String> arguments) {
+  // TODO(rnystrom): Validate args. Usage.
+  var matrix = TestMatrix.fromPath(arguments[0]);
+  for (var configuration in matrix.configurations) {
+    print(configuration);
+  }
+}
diff --git a/pkg/smith/lib/configuration.dart b/pkg/smith/lib/configuration.dart
new file mode 100644
index 0000000..0467305
--- /dev/null
+++ b/pkg/smith/lib/configuration.dart
@@ -0,0 +1,795 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:io';
+
+// TODO(rnystrom): Differences from test.dart's version:
+// - Remove special handling for "ff" as firefox.
+// - "windows" -> "win".
+// - "macos" -> "mac".
+// - toString() on enum classes is just name.
+// - builderTag defaults to empty string, not null.
+// Need to migrate test.dart to not expect the above before it can use this.
+
+// READ ME! If you add a new field to this, make sure to add it to
+// [parse()], [optionsEqual()], [hashCode], and [toString()]. A good check is to
+// comment out an existing field and see what breaks. Every error is a place
+// where you will need to add code for your new field.
+
+/// A set of options that affects how a Dart SDK test is run in a way that may
+/// affect its outcome.
+///
+/// This includes options like "compiler" and "runtime" which fundamentally
+/// decide how a test is executed. Options are tracked because a single test
+/// may have different outcomes for different configurations. For example, it
+/// may currently pass on the VM but not dart2js or vice versa.
+///
+/// Options that affect how a test can be run but don't affect its outcome are
+/// *not* stored here. Things like how test results are displayed, where logs
+/// are written, etc. live outside of this.
+class Configuration {
+  /// Expands a configuration name "[template]" all using [optionsJson] to a
+  /// list of configurations.
+  ///
+  /// A template is a configuration name that contains zero or more
+  /// parenthesized sections. Within the parentheses are a series of options
+  /// separated by pipes. For example:
+  ///
+  ///     strong-fasta-(linux|mac|win)-(debug|release)
+  ///
+  /// Text outside of parenthesized groups is treated literally. Each
+  /// parenthesized section expands to a configuration for each of the options
+  /// separated by pipes. If a template contains multiple parenthesized
+  /// sections, configurations are created for all combinations of them. The
+  /// above template expands to:
+  ///
+  ///     strong-fasta-linux-debug
+  ///     strong-fasta-linux-release
+  ///     strong-fasta-mac-debug
+  ///     strong-fasta-mac-release
+  ///     strong-fasta-win-debug
+  ///     strong-fasta-win-release
+  ///
+  /// After expansion, the resulting strings (and [optionsJson]) are passed to
+  /// [parse()] to convert each one to a full configuration.
+  static List<Configuration> expandTemplate(
+      String template, Map<String, dynamic> optionsJson) {
+    if (template.isEmpty) throw FormatException("Template must not be empty.");
+
+    var sections = <List<String>>[];
+    var start = 0;
+    while (start < template.length) {
+      var openParen = template.indexOf("(", start);
+
+      if (openParen == -1) {
+        // Add the last literal section.
+        sections.add([template.substring(start, template.length)]);
+        break;
+      }
+
+      var closeParen = template.indexOf(")", openParen);
+      if (closeParen == -1) {
+        throw FormatException('Missing ")" in name template "$template".');
+      }
+
+      // Add the literal part before the next "(".
+      sections.add([template.substring(start, openParen)]);
+
+      // Add the options within the parentheses.
+      sections.add(template.substring(openParen + 1, closeParen).split("|"));
+
+      // Continue past the ")".
+      start = closeParen + 1;
+    }
+
+    var result = <Configuration>[];
+
+    // Walk through every combination of every section.
+    iterateSection(String prefix, int section) {
+      // If we pinned all the sections, parse it.
+      if (section >= sections.length) {
+        try {
+          result.add(Configuration.parse(prefix, optionsJson));
+        } on FormatException catch (ex) {
+          throw FormatException(
+              'Could not parse expanded configuration "$prefix" from template '
+              '"$template":\n${ex.message}');
+        }
+        return;
+      }
+
+      for (var i = 0; i < sections[section].length; i++) {
+        iterateSection(prefix + sections[section][i], section + 1);
+      }
+    }
+
+    iterateSection("", 0);
+
+    return result;
+  }
+
+  /// Parse a single configuration with [name] with additional options defined
+  /// in [optionsJson].
+  ///
+  /// The name should be a series of words separated by hyphens. Any word that
+  /// matches the name of an [Architecture], [Compiler], [Mode], [Runtime], or
+  /// [System] sets that option in the resulting configuration. Those options
+  /// may also be specified in the JSON map.
+  ///
+  /// Additional Boolean and string options are defined in the map. The key
+  /// names match the corresponding command-line option names, using kebab-case.
+  static Configuration parse(String name, Map<String, dynamic> optionsJson) {
+    if (name.isEmpty) throw FormatException("Name must not be empty.");
+
+    // Infer option values from the words in the configuration name.
+    var words = name.split("-").toSet();
+    var optionsCopy = new Map.of(optionsJson);
+
+    T enumOption<T extends NamedEnum>(
+        String option, List<String> allowed, T Function(String) parse) {
+      // Look up the value from the words in the name.
+      T fromName;
+      for (var value in allowed) {
+        // Don't treat "none" as matchable since it's ambiguous as to whether
+        // it refers to compiler or runtime.
+        if (value == "none") continue;
+
+        if (words.contains(value)) {
+          if (fromName != null) {
+            throw FormatException(
+                'Found multiple values for $option ("$fromName" and "$value"), '
+                'in configuration name.');
+          }
+          fromName = parse(value);
+        }
+      }
+
+      // Look up the value from the options.
+      T fromOption;
+      if (optionsCopy.containsKey(option)) {
+        fromOption = parse(optionsCopy[option] as String);
+        optionsCopy.remove(option);
+      }
+
+      if (fromName != null && fromOption != null) {
+        if (fromName == fromOption) {
+          throw FormatException(
+              'Redundant $option in configuration name "$fromName" and options.');
+        } else {
+          throw FormatException(
+              'Found $option "$fromOption" in options and "$fromName" in '
+              'configuration name.');
+        }
+      }
+
+      return fromName ?? fromOption;
+    }
+
+    bool boolOption(String option) {
+      if (!optionsCopy.containsKey(option)) return null;
+
+      var value = optionsCopy.remove(option);
+      if (value == null) throw FormatException('Option "$option" was null.');
+      if (value is! bool) {
+        throw FormatException('Option "$option" had value "$value", which is '
+            'not a bool.');
+      }
+      return value as bool;
+    }
+
+    int intOption(String option) {
+      if (!optionsCopy.containsKey(option)) return null;
+
+      var value = optionsCopy.remove(option);
+      if (value == null) throw FormatException('Option "$option" was null.');
+      if (value is! int) {
+        throw FormatException('Option "$option" had value "$value", which is '
+            'not an int.');
+      }
+      return value as int;
+    }
+
+    String stringOption(String option) {
+      if (!optionsCopy.containsKey(option)) return null;
+
+      var value = optionsCopy.remove(option);
+      if (value == null) throw FormatException('Option "$option" was null.');
+      if (value is! String) {
+        throw FormatException('Option "$option" had value "$value", which is '
+            'not a string.');
+      }
+      return value as String;
+    }
+
+    // Extract options from the name and map.
+    var architecture =
+        enumOption("architecture", Architecture.names, Architecture.find);
+    var compiler = enumOption("compiler", Compiler.names, Compiler.find);
+    var mode = enumOption("mode", Mode.names, Mode.find);
+    var runtime = enumOption("runtime", Runtime.names, Runtime.find);
+    var system = enumOption("system", System.names, System.find);
+
+    // Fill in any missing values using defaults when possible.
+    architecture ??= Architecture.x64;
+    system ??= System.host;
+
+    // Infer from compiler from runtime or vice versa.
+    if (compiler == null) {
+      if (runtime == null) {
+        throw FormatException(
+            'Must specify at least one of compiler or runtime in options or '
+            'configuration name.');
+      } else {
+        compiler = runtime.defaultCompiler;
+      }
+    } else {
+      if (runtime == null) {
+        runtime = compiler.defaultRuntime;
+      } else {
+        // Do nothing, specified both.
+      }
+    }
+
+    // Infer the mode from the compiler.
+    mode ??= compiler.defaultMode;
+
+    var configuration = Configuration(
+        name, architecture, compiler, mode, runtime, system,
+        builderTag: stringOption("builder-tag"),
+        vmOptions: stringOption("vm-options"),
+        timeout: intOption("timeout"),
+        enableAsserts: boolOption("enable-asserts"),
+        isChecked: boolOption("checked"),
+        isCsp: boolOption("csp"),
+        isHostChecked: boolOption("host-checked"),
+        isMinified: boolOption("minified"),
+        isStrong: boolOption("strong"),
+        previewDart2: boolOption("preview-dart-2"),
+        useBlobs: boolOption("use-blobs"),
+        useDart2JSWithKernel: boolOption("dart2js-with-kernel"),
+        useDart2JSOldFrontEnd: boolOption("dart2js-old-frontend"),
+        useFastStartup: boolOption("fast-startup"),
+        useHotReload: boolOption("hot-reload"),
+        useHotReloadRollback: boolOption("hot-reload-rollback"),
+        useSdk: boolOption("use-sdk"));
+
+    // Should have consumed the whole map.
+    if (optionsCopy.isNotEmpty) {
+      throw new FormatException('Unknown option "${optionsCopy.keys.first}".');
+    }
+
+    return configuration;
+  }
+
+  final String name;
+
+  final Architecture architecture;
+
+  final Compiler compiler;
+
+  final Mode mode;
+
+  final Runtime runtime;
+
+  final System system;
+
+  // TODO(rnystrom): Is this still needed?
+  final String builderTag;
+
+  final String vmOptions;
+
+  final int timeout;
+
+  final bool enableAsserts;
+
+  // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
+  final bool isChecked;
+
+  final bool isCsp;
+
+  // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
+  final bool isHostChecked;
+
+  final bool isMinified;
+
+  // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
+  final bool isStrong;
+
+  // TODO(rnystrom): Remove this when Dart 1.0 is no longer supported.
+  final bool previewDart2;
+
+  // TODO(rnystrom): What is this?
+  final bool useBlobs;
+
+  // TODO(rnystrom): Remove these when Dart 1.0 is no longer supported.
+  final bool useDart2JSWithKernel;
+  final bool useDart2JSOldFrontEnd;
+
+  final bool useFastStartup;
+
+  final bool useHotReload;
+  final bool useHotReloadRollback;
+
+  final bool useSdk;
+
+  Configuration(this.name, this.architecture, this.compiler, this.mode,
+      this.runtime, this.system,
+      {String builderTag,
+      String vmOptions,
+      int timeout,
+      bool enableAsserts,
+      bool isChecked,
+      bool isCsp,
+      bool isHostChecked,
+      bool isMinified,
+      bool isStrong,
+      bool previewDart2,
+      bool useBlobs,
+      bool useDart2JSWithKernel,
+      bool useDart2JSOldFrontEnd,
+      bool useFastStartup,
+      bool useHotReload,
+      bool useHotReloadRollback,
+      bool useSdk})
+      : builderTag = builderTag ?? "",
+        vmOptions = vmOptions ?? "",
+        timeout = timeout ?? 0,
+        enableAsserts = enableAsserts ?? false,
+        isChecked = isChecked ?? false,
+        isCsp = isCsp ?? false,
+        isHostChecked = isHostChecked ?? false,
+        isMinified = isMinified ?? false,
+        isStrong = isStrong ?? false,
+        previewDart2 = previewDart2 ?? false,
+        useBlobs = useBlobs ?? false,
+        useDart2JSWithKernel = useDart2JSWithKernel ?? false,
+        useDart2JSOldFrontEnd = useDart2JSOldFrontEnd ?? false,
+        useFastStartup = useFastStartup ?? false,
+        useHotReload = useHotReload ?? false,
+        useHotReloadRollback = useHotReloadRollback ?? false,
+        useSdk = useSdk ?? false;
+
+  /// Returns `true` if this configuration's options all have the same values
+  /// as [other].
+  bool optionsEqual(Configuration other) =>
+      architecture == other.architecture &&
+      compiler == other.compiler &&
+      mode == other.mode &&
+      runtime == other.runtime &&
+      system == other.system &&
+      builderTag == other.builderTag &&
+      vmOptions == other.vmOptions &&
+      timeout == other.timeout &&
+      enableAsserts == other.enableAsserts &&
+      isChecked == other.isChecked &&
+      isCsp == other.isCsp &&
+      isHostChecked == other.isHostChecked &&
+      isMinified == other.isMinified &&
+      isStrong == other.isStrong &&
+      previewDart2 == other.previewDart2 &&
+      useBlobs == other.useBlobs &&
+      useDart2JSWithKernel == other.useDart2JSWithKernel &&
+      useDart2JSOldFrontEnd == other.useDart2JSOldFrontEnd &&
+      useFastStartup == other.useFastStartup &&
+      useHotReload == other.useHotReload &&
+      useHotReloadRollback == other.useHotReloadRollback &&
+      useSdk == other.useSdk;
+
+  bool operator ==(Object other) =>
+      other is Configuration && name == other.name && optionsEqual(other);
+
+  int get hashCode =>
+      name.hashCode ^
+      architecture.hashCode ^
+      compiler.hashCode ^
+      mode.hashCode ^
+      runtime.hashCode ^
+      system.hashCode ^
+      builderTag.hashCode ^
+      vmOptions.hashCode ^
+      timeout.hashCode ^
+      (enableAsserts ? 1 : 0) ^
+      (isChecked ? 2 : 0) ^
+      (isCsp ? 4 : 0) ^
+      (isHostChecked ? 8 : 0) ^
+      (isMinified ? 16 : 0) ^
+      (isStrong ? 32 : 0) ^
+      (previewDart2 ? 64 : 0) ^
+      (useBlobs ? 128 : 0) ^
+      (useDart2JSWithKernel ? 256 : 0) ^
+      (useDart2JSOldFrontEnd ? 512 : 0) ^
+      (useFastStartup ? 1024 : 0) ^
+      (useHotReload ? 2048 : 0) ^
+      (useHotReloadRollback ? 4096 : 0) ^
+      (useSdk ? 8192 : 0);
+
+  String toString() {
+    var buffer = new StringBuffer();
+    buffer.write(name);
+    buffer.write("(");
+
+    var fields = <String>[];
+    fields.add("architecture: $architecture");
+    fields.add("compiler: $compiler");
+    fields.add("mode: $mode");
+    fields.add("runtime: $runtime");
+    fields.add("system: $system");
+
+    if (builderTag != "") fields.add("builder-tag: $builderTag");
+    if (vmOptions != "") fields.add("vm-options: $vmOptions");
+    if (timeout != 0) fields.add("timeout: $timeout");
+    if (enableAsserts) fields.add("enable-asserts");
+    if (isChecked) fields.add("checked");
+    if (isCsp) fields.add("csp");
+    if (isHostChecked) fields.add("host-checked");
+    if (isMinified) fields.add("minified");
+    if (isStrong) fields.add("strong");
+    if (previewDart2) fields.add("preview-dart-2");
+    if (useBlobs) fields.add("use-blobs");
+    if (useDart2JSWithKernel) fields.add("dart2js-with-kernel");
+    if (useDart2JSOldFrontEnd) fields.add("dart2js-old-frontend");
+    if (useFastStartup) fields.add("fast-startup");
+    if (useHotReload) fields.add("hot-reload");
+    if (useHotReloadRollback) fields.add("hot-reload-rollback");
+    if (useSdk) fields.add("use-sdk");
+
+    buffer.write(fields.join(", "));
+    buffer.write(")");
+    return buffer.toString();
+  }
+}
+
+class Architecture extends NamedEnum {
+  static const ia32 = const Architecture._('ia32');
+  static const x64 = const Architecture._('x64');
+  static const arm = const Architecture._('arm');
+  static const armv6 = const Architecture._('armv6');
+  static const armv5te = const Architecture._('armv5te');
+  static const arm64 = const Architecture._('arm64');
+  static const simarm = const Architecture._('simarm');
+  static const simarmv6 = const Architecture._('simarmv6');
+  static const simarmv5te = const Architecture._('simarmv5te');
+  static const simarm64 = const Architecture._('simarm64');
+  static const simdbc = const Architecture._('simdbc');
+  static const simdbc64 = const Architecture._('simdbc64');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, Architecture>.fromIterable([
+    ia32,
+    x64,
+    arm,
+    armv6,
+    armv5te,
+    arm64,
+    simarm,
+    simarmv6,
+    simarmv5te,
+    simarm64,
+    simdbc,
+    simdbc64
+  ], key: (architecture) => (architecture as Architecture).name);
+
+  static Architecture find(String name) {
+    var architecture = _all[name];
+    if (architecture != null) return architecture;
+
+    throw new ArgumentError('Unknown architecture "$name".');
+  }
+
+  const Architecture._(String name) : super(name);
+}
+
+class Compiler extends NamedEnum {
+  static const none = const Compiler._('none');
+  static const precompiler = const Compiler._('precompiler');
+  static const dart2js = const Compiler._('dart2js');
+  static const dart2analyzer = const Compiler._('dart2analyzer');
+  static const dartdevc = const Compiler._('dartdevc');
+  static const dartdevk = const Compiler._('dartdevk');
+  static const appJit = const Compiler._('app_jit');
+  static const appJitk = const Compiler._('app_jitk');
+  static const dartk = const Compiler._('dartk');
+  static const dartkp = const Compiler._('dartkp');
+  static const specParser = const Compiler._('spec_parser');
+  static const fasta = const Compiler._('fasta');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, Compiler>.fromIterable([
+    none,
+    precompiler,
+    dart2js,
+    dart2analyzer,
+    dartdevc,
+    dartdevk,
+    appJit,
+    appJitk,
+    dartk,
+    dartkp,
+    specParser,
+    fasta,
+  ], key: (compiler) => (compiler as Compiler).name);
+
+  static Compiler find(String name) {
+    var compiler = _all[name];
+    if (compiler != null) return compiler;
+
+    throw new ArgumentError('Unknown compiler "$name".');
+  }
+
+  const Compiler._(String name) : super(name);
+
+  /// Gets the runtimes this compiler can target.
+  List<Runtime> get supportedRuntimes {
+    switch (this) {
+      case Compiler.dart2js:
+        // Note: by adding 'none' as a configuration, if the user
+        // runs test.py -c dart2js -r drt,none the dart2js_none and
+        // dart2js_drt will be duplicating work. If later we don't need 'none'
+        // with dart2js, we should remove it from here.
+        return const [
+          Runtime.d8,
+          Runtime.jsshell,
+          Runtime.none,
+          Runtime.firefox,
+          Runtime.chrome,
+          Runtime.safari,
+          Runtime.ie9,
+          Runtime.ie10,
+          Runtime.ie11,
+          Runtime.chromeOnAndroid,
+        ];
+
+      case Compiler.dartdevc:
+      case Compiler.dartdevk:
+        // TODO(rnystrom): Expand to support other JS execution environments
+        // (other browsers, d8) when tested and working.
+        return const [
+          Runtime.none,
+          Runtime.chrome,
+        ];
+
+      case Compiler.dart2analyzer:
+        return const [Runtime.none];
+      case Compiler.appJit:
+      case Compiler.appJitk:
+      case Compiler.dartk:
+        return const [Runtime.vm, Runtime.selfCheck];
+      case Compiler.precompiler:
+      case Compiler.dartkp:
+        return const [Runtime.dartPrecompiled];
+      case Compiler.specParser:
+        return const [Runtime.none];
+      case Compiler.fasta:
+        return const [Runtime.none];
+      case Compiler.none:
+        return const [Runtime.vm, Runtime.flutter];
+    }
+
+    throw "unreachable";
+  }
+
+  /// The preferred runtime to use with this compiler if no other runtime is
+  /// specified.
+  Runtime get defaultRuntime {
+    switch (this) {
+      case Compiler.dart2js:
+        return Runtime.d8;
+      case Compiler.dartdevc:
+      case Compiler.dartdevk:
+        return Runtime.chrome;
+      case Compiler.dart2analyzer:
+        return Runtime.none;
+      case Compiler.appJit:
+      case Compiler.appJitk:
+      case Compiler.dartk:
+        return Runtime.vm;
+      case Compiler.precompiler:
+      case Compiler.dartkp:
+        return Runtime.dartPrecompiled;
+      case Compiler.specParser:
+      case Compiler.fasta:
+        return Runtime.none;
+      case Compiler.none:
+        return Runtime.vm;
+    }
+
+    throw "unreachable";
+  }
+
+  Mode get defaultMode {
+    switch (this) {
+      case Compiler.dart2analyzer:
+      case Compiler.dart2js:
+      case Compiler.dartdevc:
+      case Compiler.dartdevk:
+      case Compiler.fasta:
+        return Mode.release;
+
+      default:
+        return Mode.debug;
+    }
+  }
+}
+
+class Mode extends NamedEnum {
+  static const debug = const Mode._('debug');
+  static const product = const Mode._('product');
+  static const release = const Mode._('release');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, Mode>.fromIterable(
+      [debug, product, release],
+      key: (mode) => (mode as Mode).name);
+
+  static Mode find(String name) {
+    var mode = _all[name];
+    if (mode != null) return mode;
+
+    throw new ArgumentError('Unknown mode "$name".');
+  }
+
+  const Mode._(String name) : super(name);
+
+  bool get isDebug => this == debug;
+}
+
+class Runtime extends NamedEnum {
+  static const vm = const Runtime._('vm');
+  static const flutter = const Runtime._('flutter');
+  static const dartPrecompiled = const Runtime._('dart_precompiled');
+  static const d8 = const Runtime._('d8');
+  static const jsshell = const Runtime._('jsshell');
+  static const firefox = const Runtime._('firefox');
+  static const chrome = const Runtime._('chrome');
+  static const safari = const Runtime._('safari');
+  static const ie9 = const Runtime._('ie9');
+  static const ie10 = const Runtime._('ie10');
+  static const ie11 = const Runtime._('ie11');
+  static const chromeOnAndroid = const Runtime._('chromeOnAndroid');
+  static const selfCheck = const Runtime._('self_check');
+  static const none = const Runtime._('none');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, Runtime>.fromIterable([
+    vm,
+    flutter,
+    dartPrecompiled,
+    d8,
+    jsshell,
+    firefox,
+    chrome,
+    safari,
+    ie9,
+    ie10,
+    ie11,
+    chromeOnAndroid,
+    selfCheck,
+    none
+  ], key: (runtime) => (runtime as Runtime).name);
+
+  static Runtime find(String name) {
+    var runtime = _all[name];
+    if (runtime != null) return runtime;
+
+    throw new ArgumentError('Unknown runtime "$name".');
+  }
+
+  const Runtime._(String name) : super(name);
+
+  bool get isBrowser => const [
+        ie9,
+        ie10,
+        ie11,
+        safari,
+        chrome,
+        firefox,
+        chromeOnAndroid
+      ].contains(this);
+
+  bool get isIE => name.startsWith("ie");
+
+  bool get isSafari => name.startsWith("safari");
+
+  /// Whether this runtime is a command-line JavaScript environment.
+  bool get isJSCommandLine => const [d8, jsshell].contains(this);
+
+  /// If the runtime doesn't support `Window.open`, we use iframes instead.
+  bool get requiresIFrame => !const [ie11, ie10].contains(this);
+
+  /// The preferred compiler to use with this runtime if no other compiler is
+  /// specified.
+  Compiler get defaultCompiler {
+    switch (this) {
+      case vm:
+      case flutter:
+        return Compiler.none;
+
+      case dartPrecompiled:
+        return Compiler.precompiler;
+
+      case d8:
+      case jsshell:
+      case firefox:
+      case chrome:
+      case safari:
+      case ie9:
+      case ie10:
+      case ie11:
+      case chromeOnAndroid:
+        return Compiler.dart2js;
+
+      case selfCheck:
+        return Compiler.dartk;
+
+      case none:
+        // If we aren't running it, we probably just want to analyze it.
+        return Compiler.dart2analyzer;
+    }
+
+    throw "unreachable";
+  }
+}
+
+class System extends NamedEnum {
+  static const android = const System._('android');
+  static const fuchsia = const System._('fuchsia');
+  static const linux = const System._('linux');
+  static const mac = const System._('mac');
+  static const win = const System._('win');
+
+  static final List<String> names = _all.keys.toList();
+
+  static final _all = new Map<String, System>.fromIterable(
+      [android, fuchsia, linux, mac, win],
+      key: (system) => (system as System).name);
+
+  /// Gets the system of the current machine.
+  static System get host => find(Platform.operatingSystem);
+
+  static System find(String name) {
+    var system = _all[name];
+    if (system != null) return system;
+
+    // Also allow dart:io's names for the operating systems.
+    switch (Platform.operatingSystem) {
+      case "macos":
+        return mac;
+      case "windows":
+        return win;
+    }
+    // TODO(rnystrom): What about ios?
+
+    throw new ArgumentError('Unknown operating system "$name".');
+  }
+
+  const System._(String name) : super(name);
+
+  /// The root directory name for build outputs on this system.
+  String get outputDirectory {
+    switch (this) {
+      case android:
+      case fuchsia:
+      case linux:
+      case win:
+        return 'out/';
+
+      case mac:
+        return 'xcodebuild/';
+    }
+
+    throw "unreachable";
+  }
+}
+
+/// Base class for an enum-like class whose values are identified by name.
+abstract class NamedEnum {
+  final String name;
+
+  const NamedEnum(this.name);
+
+  String toString() => name;
+}
diff --git a/pkg/smith/lib/smith.dart b/pkg/smith/lib/smith.dart
new file mode 100644
index 0000000..7118870
--- /dev/null
+++ b/pkg/smith/lib/smith.dart
@@ -0,0 +1,5 @@
+// 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.
+export 'configuration.dart';
+export 'test_matrix.dart';
diff --git a/pkg/smith/lib/test_matrix.dart b/pkg/smith/lib/test_matrix.dart
new file mode 100644
index 0000000..0bf2a5b
--- /dev/null
+++ b/pkg/smith/lib/test_matrix.dart
@@ -0,0 +1,55 @@
+// 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:convert';
+import 'dart:io';
+
+import 'configuration.dart';
+
+/// The manifest that defines the set of supported test [Configuration]s and
+/// how they are run on the bots.
+class TestMatrix {
+  final List<Configuration> configurations;
+
+  /// Reads a test matrix from the file at [path].
+  static TestMatrix fromPath(String path) {
+    var json = jsonDecode(new File(path).readAsStringSync());
+    return fromJson(json as Map<String, dynamic>);
+  }
+
+  static TestMatrix fromJson(Map<String, dynamic> json) {
+    var configurationsJson = json["configurations"] as Map<String, dynamic>;
+
+    // Keep track of the configurations and which templates they were expanded
+    // from.
+    var configurations = <Configuration>[];
+
+    configurationsJson.forEach((template, configurationJson) {
+      var options = configurationJson["options"] ?? const <String, dynamic>{};
+
+      for (var configuration in Configuration.expandTemplate(
+          template, options as Map<String, dynamic>)) {
+        for (var existing in configurations) {
+          // Make the names don't collide.
+          if (configuration.name == existing.name) {
+            throw FormatException(
+                'Configuration "${configuration.name}" already exists.');
+          }
+
+          // Make sure we don't have two equivalent configurations.
+          if (configuration.optionsEqual(existing)) {
+            throw FormatException(
+                'Configuration "${configuration.name}" is identical to '
+                '"${existing.name}".');
+          }
+        }
+
+        configurations.add(configuration);
+      }
+    });
+
+    return TestMatrix._(configurations);
+  }
+
+  TestMatrix._(this.configurations);
+}
diff --git a/pkg/smith/pubspec.yaml b/pkg/smith/pubspec.yaml
new file mode 100644
index 0000000..42a702f
--- /dev/null
+++ b/pkg/smith/pubspec.yaml
@@ -0,0 +1,7 @@
+name: smith
+author: Dart Team <misc@dartlang.org>
+description: Shared code for working with the Dart SDK's tests and test runner.
+homepage: http://www.dartlang.org
+dev_dependencies:
+  expect:
+    path: ../expect
diff --git a/pkg/smith/test/configuration_test.dart b/pkg/smith/test/configuration_test.dart
new file mode 100644
index 0000000..56404d0
--- /dev/null
+++ b/pkg/smith/test/configuration_test.dart
@@ -0,0 +1,369 @@
+// 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:expect/minitest.dart';
+
+import 'package:smith/smith.dart';
+
+void main() {
+  group("Configuration", () {
+    test("equality", () {
+      // Same.
+      expect(
+          Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
+              Runtime.vm, System.linux),
+          equals(Configuration("name", Architecture.x64, Compiler.dart2js,
+              Mode.debug, Runtime.vm, System.linux)));
+
+      // Mode debug != release.
+      expect(
+          Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
+              Runtime.vm, System.linux),
+          notEquals(Configuration("name", Architecture.x64, Compiler.dart2js,
+              Mode.release, Runtime.vm, System.linux)));
+
+      // Differ by non-required option.
+      expect(
+          Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
+              Runtime.vm, System.linux, enableAsserts: true),
+          notEquals(Configuration("name", Architecture.x64, Compiler.dart2js,
+              Mode.debug, Runtime.vm, System.linux,
+              enableAsserts: false)));
+    });
+
+    group(".expandTemplate()", () {
+      test("empty string", () {
+        expectExpandError("", {}, 'Template must not be empty.');
+      });
+
+      test("missing ')'", () {
+        expectExpandError(
+            "before-(oops", {}, 'Missing ")" in name template "before-(oops".');
+      });
+
+      test("no parentheses", () {
+        expect(
+            Configuration.expandTemplate("x64-dart2js-debug-vm-linux", {}),
+            equals([
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
+            ]));
+      });
+
+      test("parentheses at beginning", () {
+        expect(
+            Configuration.expandTemplate(
+                "(ia32|x64)-dart2js-debug-vm-linux", {}),
+            equals([
+              Configuration("ia32-dart2js-debug-vm-linux", Architecture.ia32,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
+            ]));
+      });
+
+      test("parentheses at end", () {
+        expect(
+            Configuration.expandTemplate(
+                "x64-dart2js-debug-vm-(linux|mac|win)", {}),
+            equals([
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
+              Configuration("x64-dart2js-debug-vm-mac", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
+              Configuration("x64-dart2js-debug-vm-win", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.win)
+            ]));
+      });
+
+      test("expands all parenthesized sections", () {
+        expect(
+            Configuration.expandTemplate(
+                "(ia32|x64)-dart2js-(debug|release)-vm-(linux|mac|win)", {}),
+            equals([
+              Configuration("ia32-dart2js-debug-vm-linux", Architecture.ia32,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
+              Configuration("ia32-dart2js-debug-vm-mac", Architecture.ia32,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
+              Configuration("ia32-dart2js-debug-vm-win", Architecture.ia32,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.win),
+              Configuration("ia32-dart2js-release-vm-linux", Architecture.ia32,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.linux),
+              Configuration("ia32-dart2js-release-vm-mac", Architecture.ia32,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.mac),
+              Configuration("ia32-dart2js-release-vm-win", Architecture.ia32,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.win),
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
+              Configuration("x64-dart2js-debug-vm-mac", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
+              Configuration("x64-dart2js-debug-vm-win", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.win),
+              Configuration("x64-dart2js-release-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.linux),
+              Configuration("x64-dart2js-release-vm-mac", Architecture.x64,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.mac),
+              Configuration("x64-dart2js-release-vm-win", Architecture.x64,
+                  Compiler.dart2js, Mode.release, Runtime.vm, System.win)
+            ]));
+      });
+      test("empty '()' is treated as empty string", () {
+        expect(
+            Configuration.expandTemplate("x64-()dart2js-debug-vm-linux", {}),
+            equals([
+              Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+                  Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
+            ]));
+      });
+    });
+
+    group(".parse()", () {
+      test("infer required fields from name", () {
+        expect(
+            Configuration.parse("ia32-dart2js-debug-vm-linux", {}),
+            equals(Configuration(
+                "ia32-dart2js-debug-vm-linux",
+                Architecture.ia32,
+                Compiler.dart2js,
+                Mode.debug,
+                Runtime.vm,
+                System.linux)));
+      });
+
+      test("read required fields from options", () {
+        expect(
+            Configuration.parse("something", {
+              "architecture": "x64",
+              "compiler": "dart2js",
+              "mode": "debug",
+              "runtime": "vm",
+              "system": "linux"
+            }),
+            equals(Configuration("something", Architecture.x64,
+                Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)));
+      });
+
+      test("required fields from both name and options", () {
+        expect(
+            Configuration.parse("dart2js-vm",
+                {"architecture": "x64", "mode": "debug", "system": "linux"}),
+            equals(Configuration("dart2js-vm", Architecture.x64,
+                Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)));
+      });
+
+      test("'none' is not treated as compiler or runtime name", () {
+        expect(
+            Configuration.parse("none-x64-dart2js-debug-vm-linux", {}),
+            equals(Configuration(
+                "none-x64-dart2js-debug-vm-linux",
+                Architecture.x64,
+                Compiler.dart2js,
+                Mode.debug,
+                Runtime.vm,
+                System.linux)));
+      });
+
+      test("architecture defaults to 'x64'", () {
+        expect(Configuration.parse("dart2js-debug-vm-linux", {}).architecture,
+            equals(Architecture.x64));
+      });
+
+      test("compiler defaults to runtime's default compiler", () {
+        expect(Configuration.parse("vm", {}).compiler, equals(Compiler.none));
+      });
+
+      test("mode defaults to compiler's default mode", () {
+        expect(Configuration.parse("dartkp-vm-linux", {}).mode,
+            equals(Mode.debug));
+
+        expect(Configuration.parse("dart2js-vm-linux", {}).mode,
+            equals(Mode.release));
+      });
+
+      test("runtime defaults to compiler's default runtime", () {
+        expect(Configuration.parse("dartdevc", {}).runtime,
+            equals(Runtime.chrome));
+      });
+
+      test("runtime defaults to compiler's default runtime from option", () {
+        expect(Configuration.parse("wat", {"compiler": "dartdevc"}).runtime,
+            equals(Runtime.chrome));
+      });
+
+      test("system defaults to the host os", () {
+        expect(
+            Configuration.parse("dart2js-vm", {}).system, equals(System.host));
+      });
+
+      test("other options from map", () {
+        expect(
+            Configuration.parse("dart2js", {
+              "builder-tag": "the tag",
+              "vm-options": "vm stuff",
+              "enable-asserts": true,
+              "checked": true,
+              "csp": true,
+              "host-checked": true,
+              "minified": true,
+              "preview-dart-2": true,
+              "dart2js-with-kernel": true,
+              "dart2js-old-frontend": true,
+              "fast-startup": true,
+              "hot-reload": true,
+              "hot-reload-rollback": true,
+              "use-sdk": true,
+            }),
+            equals(Configuration(
+              "dart2js",
+              Architecture.x64,
+              Compiler.dart2js,
+              Mode.release,
+              Runtime.d8,
+              System.host,
+              builderTag: "the tag",
+              vmOptions: "vm stuff",
+              enableAsserts: true,
+              isChecked: true,
+              isCsp: true,
+              isHostChecked: true,
+              isMinified: true,
+              previewDart2: true,
+              useDart2JSWithKernel: true,
+              useDart2JSOldFrontEnd: true,
+              useFastStartup: true,
+              useHotReload: true,
+              useHotReloadRollback: true,
+              useSdk: true,
+            )));
+      });
+
+      test("neither compiler nor runtime specified", () {
+        expectParseError(
+            "debug",
+            {},
+            'Must specify at least one of compiler or runtime in options or '
+            'configuration name.');
+      });
+
+      test("empty string", () {
+        expectParseError("", {}, 'Name must not be empty.');
+      });
+
+      test("redundant field", () {
+        expectParseError("dart2js-debug", {"mode": "debug"},
+            'Redundant mode in configuration name "debug" and options.');
+      });
+
+      test("duplicate field", () {
+        expectParseError(
+            "dart2js-debug",
+            {"mode": "release"},
+            'Found mode "release" in options and "debug" in configuration '
+            'name.');
+      });
+
+      test("multiple values for same option in name", () {
+        expectParseError(
+            "dart2js-debug-release",
+            {},
+            'Found multiple values for mode ("debug" and "release"), in '
+            'configuration name.');
+      });
+
+      test("null bool option", () {
+        expectParseError("dart2js", {"enable-asserts": null},
+            'Option "enable-asserts" was null.');
+      });
+
+      test("wrong type for bool option", () {
+        expectParseError("dart2js", {"enable-asserts": "false"},
+            'Option "enable-asserts" had value "false", which is not a bool.');
+      });
+
+      test("null string option", () {
+        expectParseError(
+            "dart2js", {"builder-tag": null}, 'Option "builder-tag" was null.');
+      });
+
+      test("wrong type for string option", () {
+        expectParseError("dart2js", {"builder-tag": true},
+            'Option "builder-tag" had value "true", which is not a string.');
+      });
+
+      test("unknown option", () {
+        expectParseError("dart2js", {"wat": "???"}, 'Unknown option "wat".');
+      });
+    });
+
+    group("constructor", () {});
+
+    group("optionsEqual()", () {
+      var debugWithAsserts = Configuration(
+        "name",
+        Architecture.x64,
+        Compiler.dart2js,
+        Mode.debug,
+        Runtime.vm,
+        System.linux,
+        enableAsserts: true,
+      );
+
+      var debugWithAsserts2 = Configuration(
+        "different name",
+        Architecture.x64,
+        Compiler.dart2js,
+        Mode.debug,
+        Runtime.vm,
+        System.linux,
+        enableAsserts: true,
+      );
+
+      var debugNoAsserts = Configuration(
+        "name",
+        Architecture.x64,
+        Compiler.dart2js,
+        Mode.debug,
+        Runtime.vm,
+        System.linux,
+      );
+
+      var releaseNoAsserts = Configuration(
+        "name",
+        Architecture.x64,
+        Compiler.dart2js,
+        Mode.release,
+        Runtime.vm,
+        System.linux,
+      );
+
+      test("different options are not equal", () {
+        expect(debugWithAsserts.optionsEqual(debugNoAsserts), isFalse);
+        expect(debugNoAsserts.optionsEqual(releaseNoAsserts), isFalse);
+        expect(releaseNoAsserts.optionsEqual(debugWithAsserts), isFalse);
+      });
+
+      test("same options are equal", () {
+        expect(debugWithAsserts.optionsEqual(debugWithAsserts2), isTrue);
+      });
+    });
+  });
+}
+
+void expectParseError(String name, Map<String, dynamic> options, String error) {
+  try {
+    var configuration = Configuration.parse(name, options);
+    fail("Expected FormatException but got $configuration.");
+  } on FormatException catch (ex) {
+    expect(ex.message, equals(error));
+  }
+}
+
+void expectExpandError(
+    String template, Map<String, dynamic> options, String error) {
+  try {
+    var configurations = Configuration.expandTemplate(template, options);
+    fail("Expected FormatException but got $configurations.");
+  } on FormatException catch (ex) {
+    expect(ex.message, equals(error));
+  }
+}
diff --git a/pkg/smith/test/test_matrix_test.dart b/pkg/smith/test/test_matrix_test.dart
new file mode 100644
index 0000000..3872422
--- /dev/null
+++ b/pkg/smith/test/test_matrix_test.dart
@@ -0,0 +1,72 @@
+// 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:expect/minitest.dart';
+
+import 'package:smith/smith.dart';
+
+void main() {
+  group("TestMatrix.fromJson()", () {
+    test("parses configurations", () {
+      var testMatrix = TestMatrix.fromJson({
+        "configurations": {
+          "x64-dart2js-debug-vm-linux": <String, dynamic>{
+            "options": <String, dynamic>{"enableAsserts": true},
+          },
+          "x64-dartdevc-vm-linux": <String, dynamic>{
+            "options": <String, dynamic>{
+              "mode": "release",
+              "enableAsserts": true
+            },
+          },
+        }
+      });
+
+      expect(
+          testMatrix.configurations[0],
+          equals(Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
+              Compiler.dart2js, Mode.debug, Runtime.vm, System.linux,
+              enableAsserts: true)));
+      expect(
+          testMatrix.configurations[1],
+          equals(Configuration("x64-dartdevc-vm-linux", Architecture.x64,
+              Compiler.dartdevc, Mode.release, Runtime.vm, System.linux,
+              enableAsserts: true)));
+    });
+
+    test("error if expanded configuration names collide", () {
+      expectJsonError(
+          'Configuration "none-x64-dart2js-debug-vm-linux" already exists.', {
+        "configurations": {
+          "none-x64-dart2js-debug-vm-linux": <String, dynamic>{},
+          "none-(x64|ia32)-dart2js-debug-vm-linux": <String, dynamic>{},
+        }
+      });
+    });
+
+    test("error if two configurations have same options", () {
+      expectJsonError(
+          'Configuration "two-x64-dart2js-debug-vm-linux" is identical to '
+          '"one-x64-dart2js-debug-vm-linux".',
+          {
+            "configurations": {
+              "one-x64-dart2js-debug-vm-linux": <String, dynamic>{
+                "options": <String, dynamic>{"enableAsserts": true}
+              },
+              "two-x64-dart2js-debug-vm-linux": <String, dynamic>{
+                "options": <String, dynamic>{"enableAsserts": true}
+              },
+            }
+          });
+    });
+  });
+}
+
+void expectJsonError(String error, Map<String, dynamic> json) {
+  try {
+    var testMatrix = TestMatrix.fromJson(json);
+    fail("Expected FormatException but got $testMatrix.");
+  } on FormatException catch (ex) {
+    expect(ex.message, equals(error));
+  }
+}
diff --git a/pkg/status_file/test/parse_and_normalize_test.dart b/pkg/status_file/test/parse_and_normalize_test.dart
index 0692c3a..a7c3338 100644
--- a/pkg/status_file/test/parse_and_normalize_test.dart
+++ b/pkg/status_file/test/parse_and_normalize_test.dart
@@ -15,19 +15,6 @@
     for (var entry in new Directory.fromUri(repoRoot.resolve(directory))
         .listSync(recursive: true)) {
       if (!entry.path.endsWith(".status")) continue;
-
-      // Inside the co19 repository, there is a status file that doesn't appear
-      // to be valid and looks more like some kind of template or help document.
-      // Ignore it.
-      var co19StatusFile = repoRoot.resolve('tests/co19/src/co19.status');
-      var co19_2StatusFile = repoRoot.resolve('tests/co19_2/src/co19.status');
-      if (FileSystemEntity.identicalSync(
-              entry.path, new File.fromUri(co19StatusFile).path) ||
-          FileSystemEntity.identicalSync(
-              entry.path, new File.fromUri(co19_2StatusFile).path)) {
-        continue;
-      }
-
       try {
         var statusFile = new StatusFile.read(entry.path);
         statusFile.toString();
diff --git a/pkg/status_file/test/repo_status_files_test.dart b/pkg/status_file/test/repo_status_files_test.dart
index 8aacb64..9f14fe7 100644
--- a/pkg/status_file/test/repo_status_files_test.dart
+++ b/pkg/status_file/test/repo_status_files_test.dart
@@ -17,19 +17,6 @@
     for (var entry in new Directory.fromUri(repoRoot.resolve(directory))
         .listSync(recursive: true)) {
       if (!entry.path.endsWith(".status")) continue;
-
-      // Inside the co19 repository, there is a status file that doesn't appear
-      // to be valid and looks more like some kind of template or help document.
-      // Ignore it.
-      var co19StatusFile = repoRoot.resolve('tests/co19/src/co19.status');
-      var co19_2StatusFile = repoRoot.resolve('tests/co19_2/src/co19.status');
-      if (FileSystemEntity.identicalSync(
-              entry.path, new File.fromUri(co19StatusFile).path) ||
-          FileSystemEntity.identicalSync(
-              entry.path, new File.fromUri(co19_2StatusFile).path)) {
-        continue;
-      }
-
       try {
         new StatusFile.read(entry.path);
       } catch (err) {
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index d5fa43b..3ccf658 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -67,6 +67,10 @@
     bytecode.addAll(_encodeBufferOut);
   }
 
+  int _getOpcodeAt(int pos) {
+    return bytecode[pos]; // TODO(alexmarkov): Take endianness into account.
+  }
+
   void _setWord(int pos, int word) {
     _encodeBufferIn[0] = word; // TODO(alexmarkov): Which endianness to use?
     bytecode.setRange(pos, pos + _encodeBufferOut.length, _encodeBufferOut);
@@ -166,8 +170,14 @@
     emitWord(_encodeT(Opcode.kJump, label.jumpOperand(offset)));
   }
 
+  void emitJumpIfNoAsserts(Label label) {
+    emitWord(_encodeT(Opcode.kJumpIfNoAsserts, label.jumpOperand(offset)));
+  }
+
   void patchJump(int pos, int rt) {
-    _setWord(pos, _encodeT(Opcode.kJump, rt));
+    final Opcode opcode = Opcode.values[_getOpcodeAt(pos)];
+    assert(isJump(opcode));
+    _setWord(pos, _encodeT(opcode, rt));
   }
 
   void emitReturn(int ra) {
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index c2e6216..a3b002b 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -18,6 +18,10 @@
 // 3. NativeCall instruction is modified to have 'D' format and take 1 argument:
 //    D = index of NativeEntry constant pool entry
 //
+// 4. JumpIfNoAsserts instruction is added. This instruction jumps to the given
+//    target if assertions are not enabled. It has the same format as Jump
+//    instruction.
+//
 
 enum Opcode {
   kTrap,
@@ -29,6 +33,7 @@
   kDropR,
   kDrop,
   kJump,
+  kJumpIfNoAsserts,
   kReturn,
   kReturnTOS,
   kMove,
@@ -266,6 +271,8 @@
       Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
   Opcode.kJump: const Format(
       Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfNoAsserts: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
   Opcode.kReturn: const Format(
       Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
   Opcode.kReturnTOS: const Format(
@@ -651,3 +658,5 @@
   exception,
   stackTrace,
 }
+
+bool isJump(Opcode opcode) => BytecodeFormats[opcode].encoding == Encoding.kT;
diff --git a/pkg/vm/lib/bytecode/disassembler.dart b/pkg/vm/lib/bytecode/disassembler.dart
index 279d492..be1e109 100644
--- a/pkg/vm/lib/bytecode/disassembler.dart
+++ b/pkg/vm/lib/bytecode/disassembler.dart
@@ -95,7 +95,7 @@
   void _scanForJumpTargets() {
     for (int i = 0; i < _instructions.length; i++) {
       final instr = _instructions[i];
-      if (instr.opcode == Opcode.kJump) {
+      if (isJump(instr.opcode)) {
         final target = i + instr.operands[0];
         assert(0 <= target && target < _instructions.length);
         if (!_labels.containsKey(target)) {
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 986874d..c3c76cf 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -30,8 +30,6 @@
 /// Flag to toggle generation of bytecode in platform kernel files.
 const bool isKernelBytecodeEnabledForPlatform = isKernelBytecodeEnabled;
 
-const bool isTraceEnabled = false;
-
 void generateBytecode(Component component,
     {bool strongMode: true, bool dropAST: false}) {
   final coreTypes = new CoreTypes(component);
@@ -107,42 +105,36 @@
     if (node.isAbstract) {
       return;
     }
-    try {
-      if (node is Field) {
-        if (node.isStatic && node.initializer != null) {
-          start(node);
-          if (node.isConst) {
-            _genPushConstExpr(node.initializer);
-          } else {
-            node.initializer.accept(this);
-          }
-          _genReturnTOS();
-          end(node);
-        }
-      } else if ((node is Procedure && !node.isRedirectingFactoryConstructor) ||
-          (node is Constructor)) {
+    if (node is Field) {
+      if (node.isStatic && node.initializer != null) {
         start(node);
-        if (node is Constructor) {
-          _genConstructorInitializers(node);
-        }
-        if (node.isExternal) {
-          final String nativeName = getExternalName(node);
-          if (nativeName == null) {
-            return;
-          }
-          _genNativeCall(nativeName);
+        if (node.isConst) {
+          _genPushConstExpr(node.initializer);
         } else {
-          node.function?.body?.accept(this);
-          // TODO(alexmarkov): figure out when 'return null' should be generated.
-          _genPushNull();
+          node.initializer.accept(this);
         }
         _genReturnTOS();
         end(node);
       }
-    } on UnsupportedOperationError catch (e) {
-      if (isTraceEnabled) {
-        print('Unable to generate bytecode for $node: $e');
+    } else if ((node is Procedure && !node.isRedirectingFactoryConstructor) ||
+        (node is Constructor)) {
+      start(node);
+      if (node is Constructor) {
+        _genConstructorInitializers(node);
       }
+      if (node.isExternal) {
+        final String nativeName = getExternalName(node);
+        if (nativeName == null) {
+          return;
+        }
+        _genNativeCall(nativeName);
+      } else {
+        node.function?.body?.accept(this);
+        // TODO(alexmarkov): figure out when 'return null' should be generated.
+        _genPushNull();
+      }
+      _genReturnTOS();
+      end(node);
     }
   }
 
@@ -230,6 +222,10 @@
   Procedure get futureValue =>
       _futureValue ??= libraryIndex.getMember('dart:async', 'Future', 'value');
 
+  Procedure _throwNewAssertionError;
+  Procedure get throwNewAssertionError => _throwNewAssertionError ??=
+      libraryIndex.getMember('dart:core', '_AssertionError', '_throwNew');
+
   void _genConstructorInitializers(Constructor node) {
     bool isRedirecting =
         node.initializers.any((init) => init is RedirectingInitializer);
@@ -491,14 +487,14 @@
   }
 
   /// Generates bool condition. Returns `true` if condition is negated.
-  bool _genCondition(Node condition) {
+  bool _genCondition(Expression condition) {
     bool negated = false;
     if (condition is Not) {
       condition = (condition as Not).operand;
       negated = true;
     }
     condition.accept(this);
-    // TODO(alexmarkov): bool check
+    asm.emitAssertBoolean(0);
     return negated;
   }
 
@@ -628,10 +624,6 @@
     metadata.mapping[node] =
         new BytecodeMetadata(cp, asm.bytecode, asm.exceptionsTable, closures);
 
-    if (isTraceEnabled) {
-      print('Generated bytecode for $node');
-    }
-
     enclosingClass = null;
     enclosingMember = null;
     classTypeParameters = null;
@@ -1611,7 +1603,24 @@
 
   @override
   visitAssertStatement(AssertStatement node) {
-    // TODO(alexmarkov): support asserts
+    final Label done = new Label();
+    asm.emitJumpIfNoAsserts(done);
+
+    final bool negated = _genCondition(node.condition);
+    _genJumpIfTrue(negated, done);
+
+    _genPushInt(node.conditionStartOffset);
+    _genPushInt(node.conditionEndOffset);
+
+    if (node.message != null) {
+      node.message.accept(this);
+    } else {
+      _genPushNull();
+    }
+
+    _genStaticCall(throwNewAssertionError, new ConstantArgDesc(3), 3);
+
+    asm.bind(done);
   }
 
   @override
@@ -1623,7 +1632,14 @@
 
   @override
   visitAssertBlock(AssertBlock node) {
-    // TODO(alexmarkov): support asserts
+    final Label done = new Label();
+    asm.emitJumpIfNoAsserts(done);
+
+    _enterScope(node);
+    visitList(node.statements, this);
+    _leaveScope();
+
+    asm.bind(done);
   }
 
   @override
@@ -1852,7 +1868,9 @@
         for (var expr in switchCase.expressions) {
           asm.emitPush(temp);
           _genPushConstExpr(expr);
-          asm.emitInstanceCall2(
+          // TODO(alexmarkov): generate InstanceCall2 once we have a way to
+          // mark ICData as having 2 checked arguments.
+          asm.emitInstanceCall1(
               2,
               cp.add(new ConstantICData(
                   InvocationKind.method, new Name('=='), equalsArgDesc)));
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 5c69abf..709d28e 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -714,7 +714,7 @@
       compiler.acceptLastDelta();
       await compiler.recompileDelta();
       compiler.acceptLastDelta();
-      return 0;
+      return;
     } finally {
       temp.deleteSync(recursive: true);
     }
diff --git a/pkg/vm/testcases/bytecode/asserts.dart b/pkg/vm/testcases/bytecode/asserts.dart
new file mode 100644
index 0000000..2778c8d
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/asserts.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.
+
+void test1(bool condition) {
+  assert(condition);
+}
+
+void test2(bool condition(), String message()) {
+  assert(condition(), message());
+}
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
new file mode 100644
index 0000000..6d2946c
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -0,0 +1,80 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  JumpIfNoAsserts      L1
+  Push                 FP[-5]
+  AssertBoolean        0
+  PushConstant         CP#0
+  IfEqStrictTOS
+  Jump                 L1
+  PushConstant         CP#1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  PushConstant         CP#5
+  IndirectStaticCall   3, CP#4
+L1:
+  PushConstant         CP#3
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Bool true
+  [1] = Int 255
+  [2] = Int 264
+  [3] = Null
+  [4] = ArgDesc num-args 3, num-type-args 0, names []
+  [5] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#4
+}
+]static method test1(core::bool condition) → void {
+  assert(condition);
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  JumpIfNoAsserts      L1
+  Push                 FP[-6]
+  InstanceCall1        1, CP#1
+  AssertBoolean        0
+  PushConstant         CP#2
+  IfEqStrictTOS
+  Jump                 L1
+  PushConstant         CP#3
+  PushConstant         CP#4
+  Push                 FP[-5]
+  InstanceCall1        1, CP#5
+  PushConstant         CP#7
+  IndirectStaticCall   3, CP#6
+L1:
+  PushConstant         CP#8
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = ICData target-name 'call', arg-desc CP#0
+  [2] = Bool true
+  [3] = Int 328
+  [4] = Int 339
+  [5] = ICData target-name 'call', arg-desc CP#0
+  [6] = ArgDesc num-args 3, num-type-args 0, names []
+  [7] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#6
+  [8] = Null
+}
+]static method test2(() → core::bool condition, () → core::String message) → void {
+  assert(condition.call(), message.call());
+}
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack
+  PushConstant         CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/async.dart b/pkg/vm/testcases/bytecode/async.dart
index e3900c7..cf1d164 100644
--- a/pkg/vm/testcases/bytecode/async.dart
+++ b/pkg/vm/testcases/bytecode/async.dart
@@ -56,4 +56,9 @@
   return nested;
 }
 
+Future<int> testAssert(Future<int> a) async {
+  assert((await a) == 42);
+  return 7;
+}
+
 main() {}
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index 60a3f58..981b101 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -714,6 +714,7 @@
   LoadFieldTOS         CP#1
   PushConstant         CP#17
   InstanceCall1        2, CP#19
+  AssertBoolean        0
   PushConstant         CP#20
   IfNeStrictTOS
   Jump                 L2
@@ -884,6 +885,7 @@
   Push                 r8
   PushConstant         CP#17
   InstanceCall1        2, CP#34
+  AssertBoolean        0
   PushConstant         CP#20
   IfNeStrictTOS
   Jump                 L7
@@ -1309,6 +1311,7 @@
   PushConstant         CP#8
   PushConstant         CP#27
   InstanceCall1        4, CP#28
+  AssertBoolean        0
   PushConstant         CP#29
   IfNeStrictTOS
   Jump                 L4
@@ -2172,6 +2175,292 @@
 }
 [@vm.bytecode=
 Bytecode {
+  Entry                4
+  CheckStack
+  AllocateContext      1
+  StoreLocal           r1
+  Push                 r1
+  Push                 r0
+  StoreFieldTOS        CP#0
+  PopLocal             r0
+  Push                 r0
+  Push                 FP[-5]
+  StoreFieldTOS        CP#1
+  AllocateContext      8
+  StoreLocal           r1
+  Push                 r1
+  Push                 r0
+  StoreFieldTOS        CP#0
+  PopLocal             r0
+  Push                 r0
+  PushConstant         CP#2
+  PushConstant         CP#4
+  IndirectStaticCall   1, CP#3
+  StoreFieldTOS        CP#5
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#7
+  PushConstant         CP#6
+  PopLocal             r2
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#8
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#9
+  Push                 r0
+  PushConstant         CP#10
+  StoreFieldTOS        CP#1
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#11
+  Push                 r0
+  PushConstant         CP#6
+  StoreFieldTOS        CP#12
+  Push                 r0
+  Allocate             CP#32
+  StoreLocal           r3
+  Push                 r3
+  PushConstant         CP#6
+  StoreFieldTOS        CP#33
+  Push                 r3
+  PushConstant         CP#6
+  StoreFieldTOS        CP#34
+  Push                 r3
+  PushConstant         CP#13
+  StoreFieldTOS        CP#35
+  Push                 r3
+  Push                 r0
+  StoreFieldTOS        CP#14
+  StoreFieldTOS        CP#16
+  Push                 r0
+  LoadFieldTOS         CP#16
+  PushConstant         CP#36
+  IndirectStaticCall   1, CP#3
+  StoreLocal           r2
+  Drop1
+  Push                 r0
+  Push                 r0
+  LoadFieldTOS         CP#16
+  PushConstant         CP#37
+  IndirectStaticCall   1, CP#3
+  StoreLocal           r3
+  StoreFieldTOS        CP#8
+  Push                 r3
+  Drop1
+  Push                 r0
+  Push                 r0
+  LoadFieldTOS         CP#16
+  PushConstant         CP#38
+  IndirectStaticCall   1, CP#3
+  StoreLocal           r3
+  StoreFieldTOS        CP#9
+  Push                 r3
+  Drop1
+  PushConstant         CP#39
+  Push                 r0
+  LoadFieldTOS         CP#16
+  PushConstant         CP#40
+  IndirectStaticCall   2, CP#20
+  Drop1
+  Push                 r0
+  LoadFieldTOS         CP#5
+  InstanceCall1        1, CP#41
+  ReturnTOS
+  Push                 r0
+  LoadFieldTOS         CP#0
+  PopLocal             r0
+  PushConstant         CP#6
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ContextOffset parent
+  [1] = ContextOffset var [0]
+  [2] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::int]
+  [3] = ArgDesc num-args 1, num-type-args 0, names []
+  [4] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#3
+  [5] = ContextOffset var [7]
+  [6] = Null
+  [7] = ContextOffset var [6]
+  [8] = ContextOffset var [3]
+  [9] = ContextOffset var [4]
+  [10] = Int 0
+  [11] = ContextOffset var [1]
+  [12] = ContextOffset var [2]
+  [13] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
+  [14] = FieldOffset dart.core::_Closure::_context
+  [15] = Int 1
+  [16] = ContextOffset var [5]
+  [17] = ArgDesc num-args 4, num-type-args 0, names []
+  [18] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#17
+  [19] = Int 42
+  [20] = ArgDesc num-args 2, num-type-args 0, names []
+  [21] = ICData target-name '==', arg-desc CP#20
+  [22] = Bool true
+  [23] = Int 1161
+  [24] = Int 1176
+  [25] = ArgDesc num-args 3, num-type-args 0, names []
+  [26] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#25
+  [27] = Int 7
+  [28] = ICData target-name 'complete', arg-desc CP#20
+  [29] = Type dynamic
+  [30] = ICData target-name 'completeError', arg-desc CP#25
+  [31] = EndClosureFunctionScope
+  [32] = Class dart.core::_Closure
+  [33] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+  [34] = FieldOffset dart.core::_Closure::_function_type_arguments
+  [35] = FieldOffset dart.core::_Closure::_function
+  [36] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#3
+  [37] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#3
+  [38] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#3
+  [39] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
+  [40] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#20
+  [41] = ICData get target-name 'future', arg-desc CP#3
+}
+Closure CP#13 {
+  EntryOptional        1, 3, 0
+  LoadConstant         r1, CP#6
+  LoadConstant         r2, CP#6
+  LoadConstant         r3, CP#6
+  Frame                6
+  CheckStack
+  Push                 r0
+  LoadFieldTOS         CP#14
+  PopLocal             r4
+  Push                 r4
+  LoadFieldTOS         CP#1
+  StoreLocal           r5
+  PushConstant         CP#10
+  IfNeStrictNumTOS
+  Jump                 L1
+  Push                 r4
+  Push                 r4
+  StoreFieldTOS        CP#12
+Try #0 start:
+  JumpIfNoAsserts      L2
+  Push                 r4
+  PushConstant         CP#15
+  StoreFieldTOS        CP#1
+  Push                 r4
+  Push                 r4
+  StoreFieldTOS        CP#11
+  Push                 r4
+  LoadFieldTOS         CP#0
+  LoadFieldTOS         CP#1
+  Push                 r4
+  LoadFieldTOS         CP#8
+  Push                 r4
+  LoadFieldTOS         CP#9
+  Push                 r4
+  LoadFieldTOS         CP#16
+  PushConstant         CP#18
+  IndirectStaticCall   4, CP#17
+  PopLocal             r8
+  PushConstant         CP#6
+  ReturnTOS
+L6:
+  IfEqNull             r2
+  Jump                 L3
+  Push                 r2
+  Push                 r3
+  Throw                1
+L3:
+  JumpIfNoAsserts      L2
+  Push                 r1
+  PushConstant         CP#19
+  InstanceCall1        2, CP#21
+  AssertBoolean        0
+  PushConstant         CP#22
+  IfEqStrictTOS
+  Jump                 L2
+  PushConstant         CP#23
+  PushConstant         CP#24
+  PushConstant         CP#6
+  PushConstant         CP#26
+  IndirectStaticCall   3, CP#25
+L2:
+  Push                 r4
+  PushConstant         CP#27
+  StoreLocal           r8
+  StoreFieldTOS        CP#7
+  Push                 r8
+  Drop1
+  Jump                 L4
+L4:
+  Push                 r4
+  LoadFieldTOS         CP#5
+  Push                 r4
+  LoadFieldTOS         CP#7
+  InstanceCall1        2, CP#28
+  Drop1
+  PushConstant         CP#6
+  ReturnTOS
+  Jump                 L5
+Try #0 end:
+Try #0 handler:
+  Push                 r0
+  LoadFieldTOS         CP#14
+  PopLocal             r4
+  Push                 r4
+  LoadFieldTOS         CP#12
+  PopLocal             r4
+  MoveSpecial          r6, exception
+  MoveSpecial          r7, stackTrace
+  Push                 r6
+  PopLocal             r8
+  Push                 r7
+  PopLocal             r9
+  Push                 r4
+  LoadFieldTOS         CP#5
+  Push                 r8
+  Push                 r9
+  InstanceCall1        3, CP#30
+  Drop1
+  Jump                 L5
+L5:
+  PushConstant         CP#6
+  ReturnTOS
+L1:
+  Push                 r4
+  LoadFieldTOS         CP#11
+  PopLocal             r4
+  Jump                 L6
+
+}
+]static method testAssert(asy::Future<core::int> a) → asy::Future<core::int> /* originally async */ {
+  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  asy::FutureOr<core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L6:
+      {
+        assert {
+          [yield] let dynamic #t8 = asy::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
+          assert(:result.{core::num::==}(42));
+        }
+        :return_value = 7;
+        break #L6;
+      }
+      :async_completer.{asy::Completer::complete}(:return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  asy::Future::microtask<dynamic>(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+[@vm.bytecode=
+Bytecode {
   Entry                0
   CheckStack
   PushConstant         CP#0
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index 8df59b8..d135ff4 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -146,6 +146,7 @@
   PushStatic           CP#0
   PushConstant         CP#1
   InstanceCall1        2, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -460,6 +461,7 @@
   PushStatic           CP#0
   PushConstant         CP#1
   InstanceCall1        2, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -467,6 +469,7 @@
   PushStatic           CP#5
   PushConstant         CP#1
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   BooleanNegateTOS
   PopLocal             r0
   Jump                 L2
@@ -475,6 +478,7 @@
   PopLocal             r0
 L2:
   Push                 r0
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L3
@@ -654,6 +658,7 @@
   PushStatic           CP#0
   PushConstant         CP#1
   InstanceCall1        2, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
@@ -661,6 +666,7 @@
   PushStatic           CP#0
   PushConstant         CP#5
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   PopLocal             r1
   Jump                 L2
 L1:
@@ -668,6 +674,7 @@
   PopLocal             r1
 L2:
   Push                 r1
+  AssertBoolean        0
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L3
@@ -675,6 +682,7 @@
   PushStatic           CP#0
   PushConstant         CP#7
   InstanceCall1        2, CP#8
+  AssertBoolean        0
   PopLocal             r0
   Jump                 L4
 L3:
@@ -682,6 +690,7 @@
   PopLocal             r0
 L4:
   Push                 r0
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L5
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 2bece87..af1ed56 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -730,6 +730,7 @@
   LoadFieldTOS         CP#1
   PushConstant         CP#13
   InstanceCall1        2, CP#14
+  AssertBoolean        0
   PushConstant         CP#15
   IfNeStrictTOS
   Jump                 L1
@@ -894,6 +895,7 @@
   LoadFieldTOS         CP#2
   PushConstant         CP#7
   InstanceCall1        2, CP#9
+  AssertBoolean        0
   PushConstant         CP#10
   IfNeStrictTOS
   Jump                 L1
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
index f2bf88a..fe91f5f 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -16,6 +16,7 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#2
   InstanceCall1        2, CP#4
+  AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L1
@@ -71,6 +72,7 @@
   Push                 r1
   PushConstant         CP#0
   InstanceCall1        2, CP#2
+  AssertBoolean        0
   PushConstant         CP#3
   IfNeStrictTOS
   Jump                 L1
@@ -78,6 +80,7 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#5
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   PushConstant         CP#3
   IfNeStrictTOS
   Jump                 L2
@@ -142,12 +145,14 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#4
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#0
   InstanceCall1        2, CP#8
+  AssertBoolean        0
   PushConstant         CP#7
   IfNeStrictTOS
   Jump                 L2
@@ -215,6 +220,7 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#2
   InstanceCall1        2, CP#4
+  AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L1
@@ -286,6 +292,7 @@
   Push                 FP[-5]
   InstanceCall1        1, CP#7
   InstanceCall1        2, CP#8
+  AssertBoolean        0
   PushConstant         CP#9
   IfEqStrictTOS
   Jump                 L1
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
index cf87dfd..c82563b 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -12,19 +12,19 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall2        2, CP#3
+  InstanceCall1        2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall2        2, CP#6
+  InstanceCall1        2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#7
-  InstanceCall2        2, CP#8
+  InstanceCall1        2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L3
@@ -99,37 +99,37 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall2        2, CP#3
+  InstanceCall1        2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall2        2, CP#6
+  InstanceCall1        2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#7
-  InstanceCall2        2, CP#8
+  InstanceCall1        2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#9
-  InstanceCall2        2, CP#10
+  InstanceCall1        2, CP#10
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#11
-  InstanceCall2        2, CP#12
+  InstanceCall1        2, CP#12
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#13
-  InstanceCall2        2, CP#14
+  InstanceCall1        2, CP#14
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
@@ -212,37 +212,37 @@
   PopLocal             r1
   Push                 r1
   PushConstant         CP#2
-  InstanceCall2        2, CP#3
+  InstanceCall1        2, CP#3
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#5
-  InstanceCall2        2, CP#6
+  InstanceCall1        2, CP#6
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#7
-  InstanceCall2        2, CP#8
+  InstanceCall1        2, CP#8
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L1
   Push                 r1
   PushConstant         CP#9
-  InstanceCall2        2, CP#10
+  InstanceCall1        2, CP#10
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#11
-  InstanceCall2        2, CP#12
+  InstanceCall1        2, CP#12
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
   Push                 r1
   PushConstant         CP#13
-  InstanceCall2        2, CP#14
+  InstanceCall1        2, CP#14
   PushConstant         CP#4
   IfEqStrictTOS
   Jump                 L2
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index f3ac1e4..bf677f1 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -571,6 +571,7 @@
   IndirectStaticCall   1, CP#1
   Drop1
   Push                 FP[-5]
+  AssertBoolean        0
   PushConstant         CP#6
   IfNeStrictTOS
   Jump                 L2
@@ -617,9 +618,9 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 2, end 35, handler 35, needs-stack-trace, types [CP#3]
+  try-index 0, outer -1, start 2, end 36, handler 36, needs-stack-trace, types [CP#3]
   try-index 1, outer 0, start 2, end 7, handler 7, needs-stack-trace, types [CP#3]
-  try-index 2, outer 0, start 11, end 24, handler 24, types [CP#3]
+  try-index 2, outer 0, start 11, end 25, handler 25, types [CP#3]
 }
 ConstantPool {
   [0] = String 'try 1 > try 2'
@@ -669,6 +670,7 @@
   Push                 r0
   PushConstant         CP#1
   InstanceCall1        2, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -676,6 +678,7 @@
   Push                 r0
   PushConstant         CP#5
   InstanceCall1        2, CP#6
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L2
@@ -715,7 +718,7 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 11, end 19, handler 19, needs-stack-trace, types [CP#7]
+  try-index 0, outer -1, start 12, end 21, handler 21, needs-stack-trace, types [CP#7]
 }
 ConstantPool {
   [0] = Int 0
@@ -765,13 +768,13 @@
   PopLocal             r2
   Push                 r2
   PushConstant         CP#3
-  InstanceCall2        2, CP#4
+  InstanceCall1        2, CP#4
   PushConstant         CP#5
   IfEqStrictTOS
   Jump                 L1
   Push                 r2
   PushConstant         CP#6
-  InstanceCall2        2, CP#7
+  InstanceCall1        2, CP#7
   PushConstant         CP#5
   IfEqStrictTOS
   Jump                 L2
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index cf66e57..9a60881 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -110,6 +110,7 @@
   PushConstant         CP#1
   PushConstant         CP#2
   InstanceCall1        4, CP#4
+  AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L1
@@ -124,6 +125,7 @@
   PushConstant         CP#1
   PushConstant         CP#9
   InstanceCall1        4, CP#10
+  AssertBoolean        0
   PushConstant         CP#5
   IfNeStrictTOS
   Jump                 L2
@@ -186,6 +188,7 @@
   Push                 FP[-7]
   PushConstant         CP#1
   InstanceCall1        4, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -200,6 +203,7 @@
   Push                 FP[-7]
   PushConstant         CP#9
   InstanceCall1        4, CP#10
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L2
@@ -368,6 +372,7 @@
   PushConstant         CP#0
   PushConstant         CP#1
   InstanceCall1        4, CP#3
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L1
@@ -381,6 +386,7 @@
   PushConstant         CP#0
   PushConstant         CP#8
   InstanceCall1        4, CP#9
+  AssertBoolean        0
   PushConstant         CP#4
   IfNeStrictTOS
   Jump                 L2
diff --git a/runtime/bin/crypto_fuchsia.cc b/runtime/bin/crypto_fuchsia.cc
index d5297ae..c2fe425 100644
--- a/runtime/bin/crypto_fuchsia.cc
+++ b/runtime/bin/crypto_fuchsia.cc
@@ -13,17 +13,7 @@
 namespace bin {
 
 bool Crypto::GetRandomBytes(intptr_t count, uint8_t* buffer) {
-  intptr_t read = 0;
-  while (read < count) {
-    const intptr_t remaining = count - read;
-    const intptr_t len =
-        (ZX_CPRNG_DRAW_MAX_LEN < remaining) ? ZX_CPRNG_DRAW_MAX_LEN : remaining;
-    const zx_status_t status = zx_cprng_draw_new(buffer + read, len);
-    if (status != ZX_OK) {
-      return false;
-    }
-    read += len;
-  }
+  zx_cprng_draw(buffer, count);
   return true;
 }
 
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index e162713..cf88c86 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -356,7 +356,6 @@
       if ((strncmp(argv[i], kChecked, strlen(kChecked)) == 0) ||
           (strncmp(argv[i], kCheckedFull, strlen(kCheckedFull)) == 0)) {
         checked_set = true;
-        vm_options->AddArgument(kCheckedFull);
         i++;
         continue;  // '-c' is not a VM flag so don't add to vm options.
       } else if (!OptionProcessor::IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
@@ -449,9 +448,11 @@
         " run using a snapshot is invalid.\n");
     return -1;
   }
-  if (checked_set && Options::preview_dart_2()) {
-    Log::PrintErr("Flags --checked and --preview-dart-2 are not compatible.\n");
-    return -1;
+  if (checked_set) {
+    vm_options->AddArgument("--enable-asserts");
+    if (Options::no_preview_dart_2()) {
+      vm_options->AddArgument("--enable-type-checks");
+    }
   }
 
   // If --snapshot is given without --snapshot-kind, default to script snapshot.
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 0592ffa..54ad3c8 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -43,7 +43,8 @@
   V(short_socket_read, short_socket_read)                                      \
   V(short_socket_write, short_socket_write)                                    \
   V(disable_exit, exit_disabled)                                               \
-  V(no_preview_dart_2, no_preview_dart_2)
+  V(no_preview_dart_2, no_preview_dart_2)                                      \
+  V(preview_dart_2, nop_option)
 
 // Boolean flags that have a short form.
 #define SHORT_BOOL_OPTIONS_LIST(V)                                             \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 5bdfcb8..7577fb7 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1555,7 +1555,7 @@
   AbstractType& type = AbstractType::Handle(zone);
   String& name = String::Handle(zone);
   String& getter_name = String::Handle(zone);
-  String& setter_name = String::Handle(zone);
+  String& other_name = String::Handle(zone);
   Class& super_class = Class::Handle(zone);
   const intptr_t num_fields = array.Length();
   for (intptr_t i = 0; i < num_fields; i++) {
@@ -1579,8 +1579,8 @@
       // An implicit setter is not generated for a static field, therefore, we
       // cannot rely on the code below handling the static setter case to report
       // a conflict with an instance setter. So we check explicitly here.
-      setter_name = Field::SetterSymbol(name);
-      super_class = FindSuperOwnerOfFunction(cls, setter_name);
+      other_name = Field::SetterSymbol(name);
+      super_class = FindSuperOwnerOfFunction(cls, other_name);
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(zone, cls.Name());
         const String& super_cls_name = String::Handle(zone, super_class.Name());
@@ -1708,6 +1708,19 @@
         }
       }
     }
+    if (function.IsImplicitGetterFunction() ||
+        function.IsImplicitSetterFunction() ||
+        function.IsImplicitStaticFieldInitializer()) {
+      // Cache the field object in the function data_ field.
+      if (function.IsImplicitSetterFunction()) {
+        other_name = Field::NameFromSetter(name);
+      } else {
+        other_name = Field::NameFromGetter(name);
+      }
+      field = cls.LookupFieldAllowPrivate(other_name);
+      ASSERT(!field.IsNull());
+      function.set_accessor_field(field);
+    }
     if (function.IsSetterFunction() || function.IsImplicitSetterFunction()) {
       if (function.is_static()) {
         super_class = FindSuperOwnerOfFunction(cls, name);
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 1b9b8e5..93bcf21bf 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -253,8 +253,7 @@
 
 bool AotCallSpecializer::TryInlineFieldAccess(StaticCallInstr* call) {
   if (call->function().IsImplicitGetterFunction()) {
-    Field& field =
-        Field::ZoneHandle(call->function().LookupImplicitGetterSetterField());
+    Field& field = Field::ZoneHandle(call->function().accessor_field());
     if (should_clone_fields_) {
       field = field.CloneFromOriginal();
     }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 23b2002..86b3e06 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -8315,8 +8315,8 @@
   return flow_graph_builder_->BuildImplicitClosureCreation(target);
 }
 
-Fragment StreamingFlowGraphBuilder::CheckBoolean() {
-  return flow_graph_builder_->CheckBoolean();
+Fragment StreamingFlowGraphBuilder::CheckBoolean(TokenPosition position) {
+  return flow_graph_builder_->CheckBoolean(position);
 }
 
 Fragment StreamingFlowGraphBuilder::CheckAssignableInCheckedMode(
@@ -8375,8 +8375,9 @@
   if (*negate) {
     SkipBytes(1);  // Skip Not tag, thus go directly to the inner expression.
   }
-  Fragment instructions = BuildExpression();  // read expression.
-  instructions += CheckBoolean();
+  TokenPosition position = TokenPosition::kNoSource;
+  Fragment instructions = BuildExpression(&position);  // read expression.
+  instructions += CheckBoolean(position);
   return instructions;
 }
 
@@ -9621,8 +9622,10 @@
 Fragment StreamingFlowGraphBuilder::BuildNot(TokenPosition* position) {
   if (position != NULL) *position = TokenPosition::kNoSource;
 
-  Fragment instructions = BuildExpression();  // read expression.
-  instructions += CheckBoolean();
+  TokenPosition operand_position = TokenPosition::kNoSource;
+  Fragment instructions =
+      BuildExpression(&operand_position);  // read expression.
+  instructions += CheckBoolean(operand_position);
   instructions += BooleanNegate();
   return instructions;
 }
@@ -10291,17 +10294,18 @@
   // The call to `_AssertionError._evaluateAssertion()` will take care of both
   // and returns a boolean.
   instructions += BuildExpression();  // read condition.
+
+  const TokenPosition condition_start_offset =
+      ReadPosition();  // read condition start offset.
+  const TokenPosition condition_end_offset =
+      ReadPosition();  // read condition end offset.
+
   instructions += PushArgument();
   instructions += EvaluateAssertion();
-  instructions += CheckBoolean();
+  instructions += CheckBoolean(condition_start_offset);
   instructions += Constant(Bool::True());
   instructions += BranchIfEqual(&then, &otherwise, false);
 
-  TokenPosition condition_start_offset =
-      ReadPosition();  // read condition start offset.
-  TokenPosition condition_end_offset =
-      ReadPosition();  // read condition end offset.
-
   const Class& klass =
       Class::ZoneHandle(Z, Library::LookupCoreClass(Symbols::AssertionError()));
   ASSERT(!klass.IsNull());
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 5b1c7dd..2636f59 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -1492,7 +1492,7 @@
   JoinEntryInstr* BuildJoinEntry(intptr_t try_index);
   Fragment Goto(JoinEntryInstr* destination);
   Fragment BuildImplicitClosureCreation(const Function& target);
-  Fragment CheckBoolean();
+  Fragment CheckBoolean(TokenPosition position);
   Fragment CheckAssignableInCheckedMode(const AbstractType& dst_type,
                                         const String& dst_name);
   Fragment CheckArgumentType(LocalVariable* variable, const AbstractType& type);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 1bb584e..7d677b5 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -2422,12 +2422,12 @@
                     ICData::kStatic);
 }
 
-Fragment FlowGraphBuilder::CheckBoolean() {
+Fragment FlowGraphBuilder::CheckBoolean(TokenPosition position) {
   Fragment instructions;
   if (I->strong() || I->type_checks() || I->asserts()) {
     LocalVariable* top_of_stack = MakeTemporary();
     instructions += LoadLocal(top_of_stack);
-    instructions += AssertBool();
+    instructions += AssertBool(position);
     instructions += Drop();
   }
   return instructions;
@@ -2451,10 +2451,10 @@
   return instructions;
 }
 
-Fragment FlowGraphBuilder::AssertBool() {
+Fragment FlowGraphBuilder::AssertBool(TokenPosition position) {
   Value* value = Pop();
-  AssertBooleanInstr* instr = new (Z)
-      AssertBooleanInstr(TokenPosition::kNoSource, value, GetNextDeoptId());
+  AssertBooleanInstr* instr =
+      new (Z) AssertBooleanInstr(position, value, GetNextDeoptId());
   Push(instr);
   return Fragment(instr);
 }
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 9bb30e5..3ef59b2 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -824,13 +824,13 @@
   Fragment EvaluateAssertion();
   Fragment CheckVariableTypeInCheckedMode(const AbstractType& dst_type,
                                           const String& name_symbol);
-  Fragment CheckBoolean();
+  Fragment CheckBoolean(TokenPosition position);
   Fragment CheckAssignable(
       const AbstractType& dst_type,
       const String& dst_name,
       AssertAssignableInstr::Kind kind = AssertAssignableInstr::kUnknown);
 
-  Fragment AssertBool();
+  Fragment AssertBool(TokenPosition position);
   Fragment AssertAssignable(
       TokenPosition position,
       const AbstractType& dst_type,
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 0430ef9..875983c 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -1495,9 +1495,15 @@
       DartCompilationPipeline pipeline;
       CompileParsedFunctionHelper helper(parsed_function, false, kNoOSRDeoptId);
       const Code& code = Code::Handle(helper.Compile(&pipeline));
+      const Function& initializer = parsed_function->function();
       if (!code.IsNull()) {
-        const Function& initializer = parsed_function->function();
         code.set_var_descriptors(Object::empty_var_descriptors());
+#if defined(DART_USE_INTERPRETER)
+      }
+      // In case the initializer has bytecode, the compilation step above only
+      // loaded the bytecode without generating code.
+      if (!code.IsNull() || initializer.HasBytecode()) {
+#endif
         // Invoke the function to evaluate the expression.
         return DartEntry::InvokeFunction(initializer, Object::empty_array());
       }
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index 312ca7f..4b8e028 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -113,6 +113,11 @@
 //    Jump to the given target. Target is specified as offset from the PC of the
 //    jump instruction.
 //
+//  - JumpIfNoAsserts target
+//
+//    Jump to the given target if assertions are not enabled.
+//    Target is specified as offset from the PC of the jump instruction.
+//
 //  - Return R; ReturnTOS
 //
 //    Return to the caller using either a value from the given register or a
@@ -772,6 +777,7 @@
   V(DropR,                                 A, num, ___, ___)                   \
   V(Drop,                                  A, num, ___, ___)                   \
   V(Jump,                                  T, tgt, ___, ___)                   \
+  V(JumpIfNoAsserts,                       T, tgt, ___, ___)                   \
   V(Return,                                A, reg, ___, ___)                   \
   V(ReturnTOS,                             0, ___, ___, ___)                   \
   V(Move,                                A_X, reg, xeg, ___)                   \
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 2d4305b..f320a65 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -887,7 +887,6 @@
 
 DART_NOINLINE bool Interpreter::InvokeCompiled(Thread* thread,
                                                RawFunction* function,
-                                               RawArray* argdesc,
                                                RawObject** call_base,
                                                RawObject** call_top,
                                                uint32_t** pc,
@@ -897,85 +896,139 @@
   // TODO(regis): Revisit.
   UNIMPLEMENTED();
 #endif
-  if (!Function::HasCode(function)) {
-    ASSERT(!Function::HasBytecode(function));
-    call_top[1] = 0;  // Code result.
-    call_top[2] = function;
-    Exit(thread, *FP, call_top + 3, *pc);
-    NativeArguments native_args(thread, 1, call_top + 2, call_top + 1);
-    if (!InvokeRuntime(thread, this, DRT_CompileFunction, native_args)) {
-      return false;
-    }
-  }
-  if (Function::HasCode(function)) {
-    RawCode* code = function->ptr()->code_;
-    ASSERT(code != StubCode::LazyCompile_entry()->code());
-    // TODO(regis): Once we share the same stack, try to invoke directly.
-#if defined(DEBUG)
-    if (IsTracingExecution()) {
-      THR_Print("%" Pu64 " ", icount_);
-      THR_Print("invoking compiled %s\n",
-                Function::Handle(function).ToCString());
-    }
-#endif
-    // On success, returns a RawInstance.  On failure, a RawError.
-    typedef RawObject* (*invokestub)(RawCode * code, RawArray * argdesc,
-                                     RawObject * *arg0, Thread * thread);
-    invokestub entrypoint = reinterpret_cast<invokestub>(
-        StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint());
-    RawObject* result;
-    Exit(thread, *FP, call_top + 1, *pc);
-    {
-      InterpreterSetjmpBuffer buffer(this);
-      if (!setjmp(buffer.buffer_)) {
-        thread->set_vm_tag(reinterpret_cast<uword>(entrypoint));
-        result = entrypoint(code, argdesc, call_base, thread);
-        thread->set_vm_tag(VMTag::kDartTagId);
-        thread->set_top_exit_frame_info(0);
-        ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
-      } else {
-        return false;
-      }
-    }
-    // Pop args and push result.
-    *SP = call_base;
-    **SP = result;
-
-    // It is legit to call the constructor of an error object, however a
-    // result of class UnhandledException must be propagated.
-    if (result->IsHeapObject() &&
-        result->GetClassId() == kUnhandledExceptionCid) {
-      (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
-      (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
-      (*SP)[2] = 0;  // Space for result.
-      Exit(thread, *FP, *SP + 3, *pc);
-      NativeArguments args(thread, 2, *SP, *SP + 2);
-      if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
-        return false;
-      }
-    }
-    return true;
-  }
-  ASSERT(Function::HasBytecode(function));
-  // Bytecode was loaded in the above compilation step.
-  // Stay in interpreter.
+  ASSERT(Function::HasCode(function));
+  RawCode* code = function->ptr()->code_;
+  ASSERT(code != StubCode::LazyCompile_entry()->code());
+  // TODO(regis): Once we share the same stack, try to invoke directly.
 #if defined(DEBUG)
   if (IsTracingExecution()) {
     THR_Print("%" Pu64 " ", icount_);
-    THR_Print("invoking %s\n", Function::Handle(function).ToCString());
+    THR_Print("invoking compiled %s\n", Function::Handle(function).ToCString());
   }
 #endif
-  RawCode* bytecode = function->ptr()->bytecode_;
-  RawObject** callee_fp = call_top + kKBCDartFrameFixedSize;
-  callee_fp[kKBCPcMarkerSlotFromFp] = bytecode;
-  callee_fp[kKBCSavedCallerPcSlotFromFp] = reinterpret_cast<RawObject*>(*pc);
-  callee_fp[kKBCSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(*FP);
-  pp_ = bytecode->ptr()->object_pool_;
-  *pc = reinterpret_cast<uint32_t*>(bytecode->ptr()->entry_point_);
-  pc_ = reinterpret_cast<uword>(*pc);  // For the profiler.
-  *FP = callee_fp;
-  *SP = *FP - 1;
-  // Dispatch will interpret function.
+  // On success, returns a RawInstance.  On failure, a RawError.
+  typedef RawObject* (*invokestub)(RawCode * code, RawArray * argdesc,
+                                   RawObject * *arg0, Thread * thread);
+  invokestub entrypoint = reinterpret_cast<invokestub>(
+      StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint());
+  RawObject* result;
+  Exit(thread, *FP, call_top + 1, *pc);
+  {
+    InterpreterSetjmpBuffer buffer(this);
+    if (!setjmp(buffer.buffer_)) {
+      thread->set_vm_tag(reinterpret_cast<uword>(entrypoint));
+      result = entrypoint(code, argdesc_, call_base, thread);
+      thread->set_vm_tag(VMTag::kDartTagId);
+      thread->set_top_exit_frame_info(0);
+      ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
+    } else {
+      return false;
+    }
+  }
+  // Pop args and push result.
+  *SP = call_base;
+  **SP = result;
+  pp_ = InterpreterHelpers::FrameCode(*FP)->ptr()->object_pool_;
+
+  // It is legit to call the constructor of an error object, however a
+  // result of class UnhandledException must be propagated.
+  if (result->IsHeapObject() &&
+      result->GetClassId() == kUnhandledExceptionCid) {
+    (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
+    (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
+    (*SP)[2] = 0;  // Space for result.
+    Exit(thread, *FP, *SP + 3, *pc);
+    NativeArguments args(thread, 2, *SP, *SP + 2);
+    if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
+      return false;
+    }
+    UNREACHABLE();
+  }
+  return true;
+}
+
+DART_NOINLINE bool Interpreter::ProcessInvocation(bool* invoked,
+                                                  Thread* thread,
+                                                  RawFunction* function,
+                                                  RawObject** call_base,
+                                                  RawObject** call_top,
+                                                  uint32_t** pc,
+                                                  RawObject*** FP,
+                                                  RawObject*** SP) {
+  ASSERT(!Function::HasCode(function) && !Function::HasBytecode(function));
+  // If the function is an implicit getter or setter, process its invocation
+  // here without code or bytecode.
+  RawFunction::Kind kind = Function::kind(function);
+  switch (kind) {
+    case RawFunction::kImplicitGetter: {
+      // Field offset in words is cached as a Smi in function's data_.
+      RawInstance* instance = reinterpret_cast<RawInstance*>((*SP)[0]);
+      RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+      intptr_t offset_in_words = Smi::Value(field->ptr()->value_.offset_);
+      (*SP)[0] =
+          reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
+      *invoked = true;
+      return true;
+    }
+    case RawFunction::kImplicitSetter: {
+      // Field offset in words is cached as a Smi in function's data_.
+      // TODO(regis): We currently ignore field.guarded_cid() and the type
+      // test of the setter value. Either execute these tests here or fall
+      // back to compiling the setter when required.
+      RawInstance* instance = reinterpret_cast<RawInstance*>((*SP)[-1]);
+      RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+      intptr_t offset_in_words = Smi::Value(field->ptr()->value_.offset_);
+      reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words] =
+          (*SP)[0];
+      *--(*SP) = Object::null();
+      *invoked = true;
+      return true;
+    }
+    case RawFunction::kImplicitStaticFinalGetter: {
+      // Field object is cached in function's data_.
+      RawField* field = reinterpret_cast<RawField*>(function->ptr()->data_);
+      RawInstance* value = field->ptr()->value_.static_value_;
+      if (value == Object::sentinel().raw() ||
+          value == Object::transition_sentinel().raw()) {
+        (*SP)[1] = 0;  // Result of invoking the initializer.
+        (*SP)[2] = field;
+        Exit(thread, *FP, *SP + 3, *pc);
+        NativeArguments native_args(thread, 1, *SP + 2, *SP + 1);
+        if (!InvokeRuntime(thread, this, DRT_InitStaticField, native_args)) {
+          return false;
+        }
+        pp_ = InterpreterHelpers::FrameCode(*FP)->ptr()->object_pool_;
+        // The field is initialized by the runtime call, but not returned.
+        value = field->ptr()->value_.static_value_;
+      }
+      // Field was initialized. Return its value.
+      *++(*SP) = value;
+      *invoked = true;
+      return true;
+    }
+    case RawFunction::kNoSuchMethodDispatcher:
+    case RawFunction::kInvokeFieldDispatcher:
+      // TODO(regis): Implement. For now, use jitted version.
+      break;
+    default:
+      break;
+  }
+  // Compile the function to either generate code or load bytecode.
+  call_top[1] = 0;  // Code result.
+  call_top[2] = function;
+  Exit(thread, *FP, call_top + 3, *pc);
+  NativeArguments native_args(thread, 1, call_top + 2, call_top + 1);
+  if (!InvokeRuntime(thread, this, DRT_CompileFunction, native_args)) {
+    return false;
+  }
+  if (Function::HasCode(function)) {
+    *invoked = true;
+    return InvokeCompiled(thread, function, call_base, call_top, pc, FP, SP);
+  }
+  ASSERT(Function::HasBytecode(function));
+  // Bytecode was loaded in the above compilation step.
+  // The caller will dispatch to the function's bytecode.
+  *invoked = false;
   ASSERT(thread->vm_tag() == VMTag::kDartTagId);
   ASSERT(thread->top_exit_frame_info() == 0);
   return true;
@@ -990,10 +1043,17 @@
   RawObject** callee_fp = call_top + kKBCDartFrameFixedSize;
 
   RawFunction* function = FrameFunction(callee_fp);
-  if (Function::HasCode(function) || !Function::HasBytecode(function)) {
-    // TODO(regis): If the function is a dispatcher, execute the dispatch here.
-    return InvokeCompiled(thread, function, argdesc_, call_base, call_top, pc,
-                          FP, SP);
+  if (Function::HasCode(function)) {
+    return InvokeCompiled(thread, function, call_base, call_top, pc, FP, SP);
+  }
+  if (!Function::HasBytecode(function)) {
+    bool invoked = false;
+    bool result = ProcessInvocation(&invoked, thread, function, call_base,
+                                    call_top, pc, FP, SP);
+    if (invoked || !result) {
+      return result;
+    }
+    ASSERT(Function::HasBytecode(function));
   }
 #if defined(DEBUG)
   if (IsTracingExecution()) {
@@ -3234,6 +3294,7 @@
 
   {
     BYTECODE(InitStaticTOS, 0);
+    UNREACHABLE();  // Not used. TODO(regis): Remove this bytecode.
     RawField* field = static_cast<RawField*>(*SP--);
     RawObject* value = field->ptr()->value_.static_value_;
     if ((value == Object::sentinel().raw()) ||
@@ -4103,6 +4164,15 @@
   }
 
   {
+    BYTECODE(JumpIfNoAsserts, 0);
+    if (!thread->isolate()->asserts()) {
+      const int32_t target = static_cast<int32_t>(op) >> 8;
+      pc += (target - 1);
+    }
+    DISPATCH();
+  }
+
+  {
     BYTECODE(LoadClassId, A_D);
     const uint16_t object_reg = rD;
     RawObject* obj = static_cast<RawObject*>(FP[object_reg]);
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index ef71e71..04b3caa 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -135,9 +135,17 @@
               RawObject*** FP,
               RawObject*** SP);
 
+  bool ProcessInvocation(bool* invoked,
+                         Thread* thread,
+                         RawFunction* function,
+                         RawObject** call_base,
+                         RawObject** call_top,
+                         uint32_t** pc,
+                         RawObject*** FP,
+                         RawObject*** SP);
+
   bool InvokeCompiled(Thread* thread,
                       RawFunction* function,
-                      RawArray* argdesc,
                       RawObject** call_base,
                       RawObject** call_top,
                       uint32_t** pc,
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index c1e7654..2440091 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5912,25 +5912,20 @@
   set_data(value);
 }
 
-RawField* Function::LookupImplicitGetterSetterField() const {
-  // TODO(27590) Store Field object inside RawFunction::data_ if possible.
-  Zone* Z = Thread::Current()->zone();
-  String& field_name = String::Handle(Z, name());
-  switch (kind()) {
-    case RawFunction::kImplicitGetter:
-    case RawFunction::kImplicitStaticFinalGetter:
-      field_name = Field::NameFromGetter(field_name);
-      break;
-    case RawFunction::kImplicitSetter:
-      field_name = Field::NameFromSetter(field_name);
-      break;
-    default:
-      UNREACHABLE();
-  }
-  ASSERT(field_name.IsSymbol());
-  const Class& owner = Class::Handle(Z, Owner());
-  ASSERT(!owner.IsNull());
-  return owner.LookupField(field_name);
+RawField* Function::accessor_field() const {
+  ASSERT(kind() == RawFunction::kImplicitGetter ||
+         kind() == RawFunction::kImplicitSetter ||
+         kind() == RawFunction::kImplicitStaticFinalGetter);
+  return Field::RawCast(raw_ptr()->data_);
+}
+
+void Function::set_accessor_field(const Field& value) const {
+  ASSERT(kind() == RawFunction::kImplicitGetter ||
+         kind() == RawFunction::kImplicitSetter ||
+         kind() == RawFunction::kImplicitStaticFinalGetter);
+  // Top level classes may be finalized multiple times.
+  ASSERT(raw_ptr()->data_ == Object::null() || raw_ptr()->data_ == value.raw());
+  set_data(value);
 }
 
 RawFunction* Function::parent_function() const {
@@ -5974,7 +5969,8 @@
 }
 
 RawFunction* Function::implicit_closure_function() const {
-  if (IsClosureFunction() || IsSignatureFunction() || IsFactory()) {
+  if (IsClosureFunction() || IsSignatureFunction() || IsFactory() ||
+      IsDispatcherOrImplicitAccessor() || IsImplicitStaticFieldInitializer()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -6193,6 +6189,9 @@
 //                            Array[2] = Kernel offset of enclosing library
 //   signature function:      SignatureData
 //   method extractor:        Function extracted closure function
+//   implicit getter:         Field
+//   implicit setter:         Field
+//   impl. static final gttr: Field
 //   noSuchMethod dispatcher: Array arguments descriptor
 //   invoke-field dispatcher: Array arguments descriptor
 //   redirecting constructor: RedirectionData
@@ -7217,6 +7216,7 @@
   clone.set_owner(clone_owner);
   clone.ClearICDataArray();
   clone.ClearCode();
+  clone.set_data(Object::null_object());
   clone.set_usage_counter(0);
   clone.set_deoptimization_counter(0);
   clone.set_optimized_instruction_count(0);
@@ -18654,7 +18654,7 @@
       // meaningless, therefore use the token index of this type parameter.
       *bound_error = LanguageError::NewFormatted(
           *bound_error, script, token_pos(), Report::AtLocation,
-          Report::kMalboundedType, Heap::kNew,
+          Report::kMalboundedType, Heap::kOld,
           "type parameter '%s' of class '%s' must extend bound '%s', "
           "but type argument '%s' is not a subtype of '%s'",
           type_param_name.ToCString(), class_name.ToCString(),
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 8c69cb2..ba4f605 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2283,8 +2283,6 @@
   RawContextScope* context_scope() const;
   void set_context_scope(const ContextScope& value) const;
 
-  RawField* LookupImplicitGetterSetterField() const;
-
   // Enclosing function of this local function.
   RawFunction* parent_function() const;
 
@@ -2294,6 +2292,9 @@
   void set_saved_args_desc(const Array& array) const;
   RawArray* saved_args_desc() const;
 
+  void set_accessor_field(const Field& value) const;
+  RawField* accessor_field() const;
+
   bool IsMethodExtractor() const {
     return kind() == RawFunction::kMethodExtractor;
   }
@@ -2348,6 +2349,9 @@
   RawFunction::Kind kind() const {
     return KindBits::decode(raw_ptr()->kind_tag_);
   }
+  static RawFunction::Kind kind(RawFunction* function) {
+    return KindBits::decode(function->ptr()->kind_tag_);
+  }
 
   RawFunction::AsyncModifier modifier() const {
     return ModifierBits::decode(raw_ptr()->kind_tag_);
@@ -2646,6 +2650,12 @@
     return kind() == RawFunction::kImplicitSetter;
   }
 
+  // Returns true if this function represents an implicit static field
+  // initializer function.
+  bool IsImplicitStaticFieldInitializer() const {
+    return kind() == RawFunction::kImplicitStaticFinalGetter;
+  }
+
   // Returns true if this function represents a (possibly implicit) closure
   // function.
   bool IsClosureFunction() const {
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 89661ef..6dd1d5b 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -330,7 +330,7 @@
   if ((kind() == RawFunction::kImplicitGetter) ||
       (kind() == RawFunction::kImplicitSetter) ||
       (kind() == RawFunction::kImplicitStaticFinalGetter)) {
-    const Field& field = Field::Handle(LookupImplicitGetterSetterField());
+    const Field& field = Field::Handle(accessor_field());
     if (!field.IsNull()) {
       jsobj.AddProperty("_field", field);
     }
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index e8ed9aa..e97f30c 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -43,11 +43,13 @@
 static zx_status_t GetLocalAndDstOffsetInSeconds(int64_t seconds_since_epoch,
                                                  int32_t* local_offset,
                                                  int32_t* dst_offset) {
-  fuchsia::timezone::TimezoneSyncPtr time_svc;
-  fuchsia::sys::ConnectToEnvironmentService(time_svc.NewRequest());
-  if (!time_svc->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000,
-                                          local_offset, dst_offset))
-    return ZX_ERR_UNAVAILABLE;
+  fuchsia::timezone::TimezoneSync2Ptr tz;
+  fuchsia::sys::ConnectToEnvironmentService(tz.NewRequest());
+  zx_status_t status = tz->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000,
+                                                    local_offset,
+                                                    dst_offset).statvs;
+  if (status != ZX_OK)
+    return status;
   *local_offset *= 60;
   *dst_offset *= 60;
   return ZX_OK;
@@ -56,10 +58,10 @@
 const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
   // TODO(abarth): Handle time zone changes.
   static const auto* tz_name = new std::string([] {
-    fuchsia::timezone::TimezoneSyncPtr time_svc;
-    fuchsia::sys::ConnectToEnvironmentService(time_svc.NewRequest());
+    fuchsia::timezone::TimezoneSyncPtr tz;
+    fuchsia::sys::ConnectToEnvironmentService(tz.NewRequest());
     fidl::StringPtr result;
-    time_svc->GetTimezoneId(&result);
+    tz->GetTimezoneId(&result);
     return *result;
   }());
   return tz_name->c_str();
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index a7a67b3..eb810c7 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1361,7 +1361,7 @@
 
 SequenceNode* Parser::ParseStaticInitializer() {
   ExpectIdentifier("field name expected");
-  CheckToken(Token::kASSIGN, "field initialier expected");
+  CheckToken(Token::kASSIGN, "field initializer expected");
   ConsumeToken();
   OpenFunctionBlock(parsed_function()->function());
   TokenPosition expr_pos = TokenPos();
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 38d5fa1..bcbb625 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1782,6 +1782,7 @@
     }
     Exceptions::PropagateError(Error::Cast(result));
   }
+  arguments.SetReturn(result);
 #else
   UNREACHABLE();
 #endif  // defined(DART_USE_INTERPRETER)
diff --git a/sdk/lib/core/symbol.dart b/sdk/lib/core/symbol.dart
index ac0fc65..8580d6f 100644
--- a/sdk/lib/core/symbol.dart
+++ b/sdk/lib/core/symbol.dart
@@ -18,7 +18,7 @@
   static const Symbol empty = const Symbol("");
 
   /**
-   * Constructs a new Symbol.
+   * Constructs a new [Symbol] representing the provided name.
    *
    * The name must be a valid public Dart member name,
    * public constructor name, or library name, optionally qualified.
@@ -39,6 +39,37 @@
    * * or the empty string (the default name of a library with no library
    *   name declaration).
    *
+   * Symbol instances created from the same [name] are equal,
+   * but not necessarily identical, but symbols created as compile-time
+   * constants are canonicalized, as all other constant object creations.
+   *
+   * ```dart
+   * assert(new Symbol("foo") == new Symbol("foo"));
+   * assert(identical(const Symbol("foo"), const Symbol("foo")));
+   * ```
+   *
+   * If [name] is a single identifier that does not start with an underscore,
+   * or it is a qualified identifier,
+   * or it is an operator name different from `unary-`,
+   * then the result of `const Symbol(name)` is the same instance that
+   * the symbol literal created by prefixing `#` to the content of [name]
+   * would evaluate to.
+   *
+   * ```dart
+   * assert(new Symbol("foo") == #foo);
+   * assert(new Symbol("[]=") == #[]=]);
+   * assert(new Symbol("foo.bar") == #foo.bar);
+   * assert(identical(const Symbol("foo"), #foo));
+   * assert(identical(const Symbol("[]="), #[]=]));
+   * assert(identical(const Symbol("foo.bar"), #foo.bar));
+   * ```
+   *
+   * This constructor cannot create a [Symbol] instance that is equal to
+   * a private symbol literal like `#_foo`.
+   * ```dart
+   * const Symbol("_foo") // Invalid
+   * ``
+   *
    * The following text is non-normative:
    *
    * Creating non-const Symbol instances may result in larger output.  If
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 60298fa..8dca3dfa 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -480,7 +480,6 @@
 LayoutTests/fast/css/content/content-normal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError # co19 issue 14
-LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/csstext-of-content-string_t01: Pass, RuntimeError # Please triage this failure
@@ -796,8 +795,6 @@
 LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/textfield-focus-out_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/validationMessage_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/validity-property_t01: RuntimeError # Issue 25155
-LayoutTests/fast/forms/willvalidate_t01: RuntimeError # Issue 25155
 LayoutTests/fast/html/article-element_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/aside-element_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/html/details-add-child-1_t01: RuntimeError # Please triage this failure
@@ -7084,31 +7081,15 @@
 LibTest/core/int/toInt_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError # Larger than 64 bit int
 LibTest/core/int/truncate_A01_t01: CompileTimeError # Larger than 64 bit int
-LibTest/html/Document/dispatchEvent_A01_t01: Crash
-LibTest/html/Document/on_A01_t01: Crash
-LibTest/html/Document/on_A01_t02: Crash
-LibTest/html/HttpRequest/abort_A01_t01: Crash
-LibTest/html/HttpRequest/dispatchEvent_A01_t01: Crash
 LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: Crash
 LibTest/html/HttpRequest/getResponseHeader_A01_t01: Crash
 LibTest/html/HttpRequest/getString_A01_t01: Crash
-LibTest/html/HttpRequest/onAbort_A01_t01: Crash
-LibTest/html/HttpRequest/onLoadEnd_A01_t01: Crash
-LibTest/html/HttpRequest/onLoadStart_A01_t01: Crash
-LibTest/html/HttpRequest/onLoad_A01_t01: Crash
-LibTest/html/HttpRequest/onReadyStateChange_A01_t01: Crash
 LibTest/html/HttpRequest/overrideMimeType_A01_t01: Crash
-LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Crash
 LibTest/html/HttpRequest/request_A01_t01: Crash
-LibTest/html/HttpRequest/responseText_A01_t01: Crash
 LibTest/html/HttpRequest/setRequestHeader_A01_t01: Crash
 LibTest/html/HttpRequest/statusText_A01_t01: Crash
 LibTest/html/HttpRequest/status_A01_t01: Crash
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: Crash
 LibTest/html/IFrameElement/contentWindow_A01_t01: Crash
-LibTest/html/IFrameElement/dispatchEvent_A01_t01: Crash
-LibTest/html/Node/dispatchEvent_A01_t01: Crash
-LibTest/html/Window/dispatchEvent_A01_t01: Crash
 LibTest/html/Window/postMessage_A01_t02: Crash
 LibTest/html/Window/requestFileSystem_A01_t01: Crash
 LibTest/html/Window/requestFileSystem_A01_t02: Crash
@@ -7151,37 +7132,21 @@
 Language/Statements/For/syntax_t13: Crash
 Language/Statements/For/syntax_t20: Crash
 LibTest/core/Invocation/namedArguments_A01_t01: Crash
-LibTest/html/Document/dispatchEvent_A01_t01: Crash
-LibTest/html/Document/on_A01_t01: Crash
-LibTest/html/Document/on_A01_t02: Crash
-LibTest/html/HttpRequest/abort_A01_t01: Crash
-LibTest/html/HttpRequest/dispatchEvent_A01_t01: Crash
 LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: Crash
 LibTest/html/HttpRequest/getResponseHeader_A01_t01: Crash
 LibTest/html/HttpRequest/getString_A01_t01: Crash
-LibTest/html/HttpRequest/onAbort_A01_t01: Crash
 LibTest/html/HttpRequest/onError_A01_t02: Crash
-LibTest/html/HttpRequest/onLoadEnd_A01_t01: Crash
-LibTest/html/HttpRequest/onLoadStart_A01_t01: Crash
-LibTest/html/HttpRequest/onLoad_A01_t01: Crash
-LibTest/html/HttpRequest/onReadyStateChange_A01_t01: Crash
 LibTest/html/HttpRequest/overrideMimeType_A01_t01: Crash
-LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Crash
 LibTest/html/HttpRequest/request_A01_t01: Crash
-LibTest/html/HttpRequest/responseText_A01_t01: Crash
 LibTest/html/HttpRequest/responseText_A01_t02: Crash
 LibTest/html/HttpRequest/setRequestHeader_A01_t01: Crash
 LibTest/html/HttpRequest/statusText_A01_t01: Crash
 LibTest/html/HttpRequest/status_A01_t01: Crash
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: Crash
 LibTest/html/HttpRequestUpload/onError_A01_t02: Crash
 LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Crash
 LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Crash
 LibTest/html/HttpRequestUpload/onLoad_A01_t01: Crash
 LibTest/html/IFrameElement/contentWindow_A01_t01: Crash
-LibTest/html/IFrameElement/dispatchEvent_A01_t01: Crash
-LibTest/html/Node/dispatchEvent_A01_t01: Crash
-LibTest/html/Window/dispatchEvent_A01_t01: Crash
 LibTest/html/Window/postMessage_A01_t02: Crash
 LibTest/html/Window/requestFileSystem_A01_t01: Crash
 LibTest/html/Window/requestFileSystem_A01_t02: Crash
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 7eabb3c..1953746 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -58,15 +58,18 @@
 Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t02: MissingCompileTimeError
 Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t02: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/static_type_t01: CompileTimeError
+Language/Classes/Getters/static_getter_t01: CompileTimeError
 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/Setters/name_t07: CompileTimeError
+Language/Classes/Setters/static_setter_t05: CompileTimeError
+Language/Classes/Setters/static_setter_t06: CompileTimeError
+Language/Classes/Static_Methods/same_name_method_and_setter_t01: 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
 Language/Classes/same_name_instance_and_static_members_t02: MissingCompileTimeError
-Language/Classes/same_name_instance_and_static_members_t03: MissingCompileTimeError
 Language/Classes/same_name_instance_and_static_members_t04: MissingCompileTimeError
 Language/Expressions/Constants/exception_t01: MissingCompileTimeError
 Language/Expressions/Constants/exception_t03: MissingCompileTimeError
@@ -92,9 +95,7 @@
 Language/Classes/Getters/same_name_method_t07: MissingCompileTimeError
 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
 Language/Classes/same_name_instance_and_static_members_t02: MissingCompileTimeError
-Language/Classes/same_name_instance_and_static_members_t03: MissingCompileTimeError
 Language/Classes/same_name_instance_and_static_members_t04: MissingCompileTimeError
 Language/Expressions/Constants/bitwise_operators_t05: MissingCompileTimeError
 Language/Expressions/Constants/depending_on_itself_t01: MissingCompileTimeError
@@ -1699,6 +1700,8 @@
 Language/Classes/Static_Methods/declaration_t01: MissingCompileTimeError
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
+Language/Classes/same_name_instance_and_static_members_t01: MissingCompileTimeError
+Language/Classes/same_name_instance_and_static_members_t03: MissingCompileTimeError
 Language/Classes/same_name_type_variable_t04: MissingCompileTimeError
 Language/Classes/same_name_type_variable_t07: MissingCompileTimeError
 Language/Expressions/Constants/bitwise_operators_t03: MissingCompileTimeError
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index 25377d5..cb9cf2c 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -11,7 +11,6 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart' show ClassEntity;
 import 'package:compiler/src/elements/names.dart';
-import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/selector.dart';
 import 'package:compiler/src/world.dart';
 import '../helpers/element_lookup.dart';
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index 833334f..f91acf6 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -68,7 +68,7 @@
 
   void checkClass(ClassEntity cls,
       {bool directlyInstantiated: false, bool indirectlyInstantiated: false}) {
-    ClassHierarchyNode node = world.classHierarchy.getClassHierarchyNode(cls);
+    ClassHierarchyNode node = world.getClassHierarchyNode(cls);
     Expect.isNotNull(node, "Expected ClassHierarchyNode for $cls.");
     Expect.equals(
         directlyInstantiated || indirectlyInstantiated,
@@ -139,7 +139,7 @@
   }
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
       .iterator;
   checkState(G, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -151,7 +151,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
+          world.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(G, currentNode: null, stack: null);
@@ -161,7 +161,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
       .iterator;
   checkState(C, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -182,7 +182,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
       .iterator;
   checkState(D, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -194,7 +194,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
       .iterator;
   checkState(B, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -209,7 +209,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
+          world.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(B, currentNode: null, stack: null);
@@ -222,7 +222,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-      world.classHierarchy.getClassHierarchyNode(B),
+      world.getClassHierarchyNode(B),
       new EnumSet<Instantiation>.fromValues(<Instantiation>[
         Instantiation.DIRECTLY_INSTANTIATED,
         Instantiation.UNINSTANTIATED
@@ -237,7 +237,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
+          world.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
       .iterator;
   checkState(A, currentNode: null, stack: null);
   Expect.isNull(iterator.current);
@@ -267,7 +267,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
+          world.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(A, currentNode: null, stack: null);
@@ -295,7 +295,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-      world.classHierarchy.getClassHierarchyNode(A),
+      world.getClassHierarchyNode(A),
       new EnumSet<Instantiation>.fromValues(<Instantiation>[
         Instantiation.DIRECTLY_INSTANTIATED,
         Instantiation.UNINSTANTIATED
@@ -325,7 +325,7 @@
   Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
-          world.classHierarchy.getClassHierarchyNode(A),
+          world.getClassHierarchyNode(A),
           new EnumSet<Instantiation>.fromValues(<Instantiation>[
             Instantiation.DIRECTLY_INSTANTIATED,
             Instantiation.UNINSTANTIATED
@@ -400,7 +400,7 @@
   ClassEntity X = env.getClass("X");
 
   void checkForEachSubclass(ClassEntity cls, List<ClassEntity> expected) {
-    ClassSet classSet = world.classHierarchy.getClassSet(cls);
+    ClassSet classSet = world.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
     classSet.forEachSubclass((cls) {
       visited.add(cls);
@@ -437,7 +437,7 @@
   checkForEachSubclass(X, [X]);
 
   void checkForEachSubtype(ClassEntity cls, List<ClassEntity> expected) {
-    ClassSet classSet = world.classHierarchy.getClassSet(cls);
+    ClassSet classSet = world.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
     classSet.forEachSubtype((cls) {
       visited.add(cls);
@@ -482,7 +482,7 @@
       mask = ClassHierarchyNode.ALL;
     }
 
-    ClassSet classSet = world.classHierarchy.getClassSet(cls);
+    ClassSet classSet = world.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
 
     IterationStep visit(_cls) {
@@ -539,7 +539,7 @@
 
   void checkAny(ClassEntity cls, List<ClassEntity> expected,
       {ClassEntity find, bool expectedResult, bool anySubtype: false}) {
-    ClassSet classSet = world.classHierarchy.getClassSet(cls);
+    ClassSet classSet = world.getClassSet(cls);
     List<ClassEntity> visited = <ClassEntity>[];
 
     bool visit(cls) {
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index fac2f27..fd5e963 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -67,7 +67,7 @@
 
   void checkClass(ClassEntity cls, List<ClassEntity> expectedSubtypes,
       {bool checkSubset: false}) {
-    ClassSet node = world.classHierarchy.getClassSet(cls);
+    ClassSet node = world.getClassSet(cls);
     Set<ClassEntity> actualSubtypes = node.subtypes().toSet();
     if (checkSubset) {
       for (ClassEntity subtype in expectedSubtypes) {
diff --git a/tests/compiler/dart2js/model/world_test.dart b/tests/compiler/dart2js/model/world_test.dart
index 78e93f1..3abdd5d 100644
--- a/tests/compiler/dart2js/model/world_test.dart
+++ b/tests/compiler/dart2js/model/world_test.dart
@@ -9,9 +9,8 @@
 import 'package:compiler/src/common/names.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/class_set.dart';
-import 'package:compiler/src/world.dart' show JClosedWorld;
+import 'package:compiler/src/world.dart' show ClassQuery, JClosedWorld;
 import '../type_test_helper.dart';
 
 void main() {
@@ -551,106 +550,65 @@
   ClassEntity A = env.getElement("A");
   ClassEntity B = env.getElement("B");
   ClassEntity C = env.getElement("C");
+  ClassEntity D = env.getElement("D");
   ClassEntity F = env.getElement("F");
   ClassEntity G = env.getElement("G");
+  ClassEntity H = env.getElement("H");
   ClassEntity I = env.getElement("I");
   ClassEntity J = env.getElement("J");
 
   void check(ClassEntity cls1, ClassQuery query1, ClassEntity cls2,
-      ClassQuery query2, SubclassResult expectedResult) {
-    SubclassResult result1 =
-        closedWorld.classHierarchy.commonSubclasses(cls1, query1, cls2, query2);
-    SubclassResult result2 =
-        closedWorld.classHierarchy.commonSubclasses(cls2, query2, cls1, query1);
-    Expect.equals(
-        result1.query,
-        result2.query,
+      ClassQuery query2, List<ClassEntity> expectedResult) {
+    Iterable<ClassEntity> result1 =
+        closedWorld.commonSubclasses(cls1, query1, cls2, query2);
+    Iterable<ClassEntity> result2 =
+        closedWorld.commonSubclasses(cls2, query2, cls1, query1);
+    Expect.setEquals(
+        result1,
+        result2,
         "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
         "\n a vs b: $result1\n b vs a: $result2");
     Expect.setEquals(
-        result1.classes,
-        result2.classes,
-        "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
-        "\n a vs b: $result1\n b vs a: $result2");
-    Expect.equals(
-        expectedResult.query,
-        result1.query,
-        "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
-        "\n expected: $expectedResult\n actual: $result1");
-    Expect.setEquals(
-        expectedResult.classes,
-        result1.classes,
+        expectedResult,
+        result1,
         "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
         "\n expected: $expectedResult\n actual: $result1");
   }
 
-  check(A, ClassQuery.EXACT, A, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, [A]));
-  check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, [A]));
-  check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.EXACT, [A]));
-  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [A]));
-  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [A]));
-  check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBTYPE, [A]));
+  check(A, ClassQuery.EXACT, A, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS, []);
+  check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE, []);
+  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS, [C]);
+  check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE, [C]);
+  check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE, [C, D]);
 
-  check(A, ClassQuery.EXACT, B, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [G]));
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [J]));
-  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [F, G, I, J]));
+  check(A, ClassQuery.EXACT, B, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS, []);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE, []);
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT, []);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS, []);
+  check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE, [G]);
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS, [J]);
+  check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE, [F, G, I, J]);
 
-  check(A, ClassQuery.EXACT, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, [C]));
-  check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, [C]));
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
-  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
-  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBTYPE, [C]));
+  check(A, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
+  check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, [G]);
+  check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, [G]);
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
+  check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G, H]);
 
-  check(B, ClassQuery.EXACT, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.EXACT, []));
-  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, []));
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [G]));
-  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE,
-      new SubclassResult.internal(ClassQuery.SUBCLASS, [F, G]));
+  check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
+  check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
+  check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []);
+  check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []);
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
+  check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]);
 }
diff --git a/tests/compiler/dart2js/needs_no_such_method_test.dart b/tests/compiler/dart2js/needs_no_such_method_test.dart
index 735e390..5cd35d2 100644
--- a/tests/compiler/dart2js/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/needs_no_such_method_test.dart
@@ -9,9 +9,8 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/call_structure.dart';
-import 'package:compiler/src/universe/class_hierarchy.dart';
 import 'package:compiler/src/universe/selector.dart';
-import 'package:compiler/src/world.dart' show JClosedWorld;
+import 'package:compiler/src/world.dart' show JClosedWorld, ClassQuery;
 import 'type_test_helper.dart';
 
 void main() {
diff --git a/tests/compiler/dart2js/rti/bound_check_test.dart b/tests/compiler/dart2js/rti/bound_check_test.dart
index 10f1b35..e767d28 100644
--- a/tests/compiler/dart2js/rti/bound_check_test.dart
+++ b/tests/compiler/dart2js/rti/bound_check_test.dart
@@ -82,7 +82,7 @@
     ], expectedOutput: OUTPUT1, printJs: args.contains('-v'));
     await runWithD8(
         memorySourceFiles: {'main.dart': SOURCE2},
-        options: [Flags.enableCheckedMode],
+        options: [Flags.noPreviewDart2, Flags.enableCheckedMode],
         expectedOutput: OUTPUT2,
         printJs: args.contains('-v'));
   });
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
new file mode 100644
index 0000000..d93f282
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals5.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:expect/expect.dart';
+
+/*strong.class: Class1a:explicit=[Class1a]*/
+class Class1a {
+  /*kernel.element: Class1a.:needsSignature*/
+  Class1a();
+}
+
+/*kernel.class: Class1b:needsArgs*/
+/*strong.class: Class1b:needsArgs*/
+/*omit.class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a {
+  /*kernel.element: Class1b.:needsSignature*/
+  Class1b();
+}
+
+/*kernel.class: Class1c:needsArgs*/
+/*strong.class: Class1c:needsArgs*/
+/*omit.class: Class1c:needsArgs*/
+class Class1c<T> extends Class1a {
+  /*kernel.element: Class1c.:needsSignature*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  Class2();
+}
+
+/*kernel.element: test:needsSignature*/
+/*strong.element: test:*/
+/*omit.element: test:*/
+test(Class1a c, Type type) {
+  return c.runtimeType == type;
+}
+
+/*kernel.element: main:needsSignature*/
+/*strong.element: main:*/
+/*omit.element: main:*/
+main() {
+  Expect.isTrue(test(new Class1a(), Class1a));
+  Expect.isFalse(test(new Class1b<int>(), Class1a));
+  Expect.isFalse(test(new Class1c<int>(), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
new file mode 100644
index 0000000..36cb66d
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
@@ -0,0 +1,54 @@
+// 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:expect/expect.dart';
+
+/*kernel.class: Class1a:needsArgs*/
+/*strong.class: Class1a:explicit=[Class1a],needsArgs*/
+/*omit.class: Class1a:needsArgs*/
+class Class1a<T> {
+  /*kernel.element: Class1a.:needsSignature*/
+  Class1a();
+}
+
+/*kernel.class: Class1b:needsArgs*/
+/*strong.class: Class1b:needsArgs*/
+/*omit.class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a<T> {
+  /*kernel.element: Class1b.:needsSignature*/
+  Class1b();
+}
+
+/*kernel.class: Class1c:needsArgs*/
+/*strong.class: Class1c:needsArgs*/
+/*omit.class: Class1c:needsArgs*/
+class Class1c<T> extends Class1a<T> {
+  /*kernel.element: Class1c.:needsSignature*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  Class2();
+}
+
+/*kernel.element: test:needsSignature*/
+/*strong.element: test:*/
+/*omit.element: test:*/
+test(Class1a c, Type type) {
+  return c.runtimeType == type;
+}
+
+/*kernel.element: main:needsSignature*/
+/*strong.element: main:*/
+/*omit.element: main:*/
+main() {
+  Expect.isTrue(test(new Class1a(), Class1a));
+  Expect.isFalse(test(new Class1b<int>(), Class1a));
+  Expect.isFalse(test(new Class1c<int>(), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
new file mode 100644
index 0000000..5cf6134
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
@@ -0,0 +1,62 @@
+// 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:expect/expect.dart';
+
+/*strong.class: Class1a:explicit=[Class1a]*/
+class Class1a {
+  /*kernel.element: Class1a.:needsSignature*/
+  Class1a();
+}
+
+/*kernel.class: Class1b:needsArgs*/
+/*strong.class: Class1b:needsArgs*/
+/*omit.class: Class1b:needsArgs*/
+class Class1b<T> extends Class1a {
+  /*kernel.element: Class1b.:needsSignature*/
+  Class1b();
+}
+
+/*kernel.class: Class1c:needsArgs*/
+/*strong.class: Class1c:needsArgs*/
+/*omit.class: Class1c:needsArgs*/
+class Class1c<T> extends Class1a {
+  /*kernel.element: Class1c.:needsSignature*/
+  Class1c();
+}
+
+/*kernel.class: Class2:needsArgs*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
+class Class2<T> {
+  /*kernel.element: Class2.:needsSignature*/
+  Class2();
+}
+
+/*kernel.class: Class3:needsArgs*/
+/*strong.class: Class3:explicit=[Class3]*/
+/*omit.class: Class3:*/
+class Class3<T> {
+  final Class1a field;
+
+  /*kernel.element: Class3.:needsSignature*/
+  Class3(this.field);
+}
+
+/*kernel.element: test:needsSignature*/
+/*strong.element: test:*/
+/*omit.element: test:*/
+test(Class3 c, Type type) {
+  return c.field.runtimeType == type;
+}
+
+/*kernel.element: main:needsSignature*/
+/*strong.element: main:*/
+/*omit.element: main:*/
+main() {
+  Expect.isTrue(test(new Class3<int>(new Class1a()), Class1a));
+  Expect.isFalse(test(new Class3<int>(new Class1b<int>()), Class1a));
+  Expect.isFalse(test(new Class3<int>(new Class1c<int>()), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
new file mode 100644
index 0000000..af98ea6
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a {
+  Class1a();
+}
+
+class Class1b<T> extends Class1a {
+  Class1b();
+}
+
+class Class1c<T> extends Class1a {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+test(Class1a c, Type type) {
+  return c.runtimeType == type;
+}
+
+main() {
+  Expect.isTrue(test(new Class1a(), Class1a));
+  Expect.isFalse(test(new Class1b<int>(), Class1a));
+  Expect.isFalse(test(new Class1c<int>(), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
new file mode 100644
index 0000000..0d2727b
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2jsOptions=--strong
+
+import 'package:expect/expect.dart';
+
+class Class1a<T> {
+  Class1a();
+}
+
+class Class1b<T> extends Class1a<T> {
+  Class1b();
+}
+
+class Class1c<T> extends Class1a<T> {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+test(Class1a c, Type type) {
+  return c.runtimeType == type;
+}
+
+main() {
+  Expect.isTrue(test(new Class1a(), Class1a));
+  Expect.isFalse(test(new Class1b<int>(), Class1a));
+  Expect.isFalse(test(new Class1c<int>(), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
new file mode 100644
index 0000000..145ceae
--- /dev/null
+++ b/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
@@ -0,0 +1,40 @@
+// 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';
+
+class Class1a {
+  Class1a();
+}
+
+class Class1b<T> extends Class1a {
+  Class1b();
+}
+
+class Class1c<T> extends Class1a {
+  Class1c();
+}
+
+class Class2<T> {
+  Class2();
+}
+
+class Class3<T> {
+  final Class1a field;
+
+  Class3(this.field);
+}
+
+test(Class3 c, Type type) {
+  return c.field.runtimeType == type;
+}
+
+main() {
+  Expect.isTrue(test(new Class3<int>(new Class1a()), Class1a));
+  Expect.isFalse(test(new Class3<int>(new Class1b<int>()), Class1a));
+  Expect.isFalse(test(new Class3<int>(new Class1c<int>()), Class1a));
+  new Class2<int>();
+}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 227ceb6..fdece1b 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -13,6 +13,9 @@
 [ $compiler != dart2analyzer ]
 switch_case_warn_test: Skip # Analyzer only, see language_analyzer2.status
 
+[ $mode == debug ]
+large_class_declaration_test: Slow, Pass
+
 [ $mode == product ]
 assertion_test: SkipByDesign # Requires checked mode.
 generic_test: SkipByDesign # Requires checked mode.
@@ -300,7 +303,6 @@
 void/return_future_or_void_sync_error3_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 void/return_future_or_void_sync_error4_test/none: MissingStaticWarning # https://github.com/dart-lang/sdk/issues/33218
 void/return_future_void_async_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
-void/return_future_void_async_test: StaticWarning # https://github.com/dart-lang/sdk/issues/33218
 void/return_void_async_error0_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 void/return_void_async_error1_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
 void/return_void_async_error2_test: MissingCompileTimeError # https://github.com/dart-lang/sdk/issues/33218
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 8ad3271..73f540f 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -14,6 +14,8 @@
 conflicting_type_variable_and_setter_test: CompileTimeError # Issue 25525
 const_cast2_test/01: CompileTimeError
 const_cast2_test/none: CompileTimeError
+const_constructor_mixin3_test/01: MissingCompileTimeError # Issue 33644
+const_constructor_mixin_test/01: MissingCompileTimeError # Issue 33644
 const_for_in_variable_test/01: MissingCompileTimeError # Issue 25161
 constructor_call_wrong_argument_count_negative_test: Fail # Issue 11585
 constructor_type_parameter_test/00: MissingCompileTimeError # Issue 33110
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index a79000f..84f88bb 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -167,13 +167,11 @@
 async_star_regression_23116_test: RuntimeError
 async_star_test/02: RuntimeError
 await_test: RuntimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test/03: RuntimeError
 bit_operations_test/04: RuntimeError
 bit_operations_test/none: RuntimeError
 branch_canonicalization_test: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-check_member_static_test/02: MissingCompileTimeError
 checked_method_error_order_test: RuntimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
@@ -296,12 +294,6 @@
 external_test/13: MissingRuntimeError
 external_test/20: MissingRuntimeError
 factory_redirection_test/07: MissingCompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: MissingCompileTimeError
 final_attempt_reinitialization_test/01: MissingCompileTimeError
 final_attempt_reinitialization_test/02: MissingCompileTimeError
 full_stacktrace1_test: RuntimeError # Issue 12698
@@ -311,9 +303,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_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 implicit_downcast_during_assert_initializer_test: RuntimeError
 infinity_test: RuntimeError # non JS number semantics - Issue 4984
@@ -340,9 +329,6 @@
 malformed2_test/00: MissingCompileTimeError
 map_literal1_test/01: MissingCompileTimeError
 map_literal8_test: RuntimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
 mixin_forwarding_constructor4_test/01: MissingCompileTimeError
 mixin_forwarding_constructor4_test/02: MissingCompileTimeError
@@ -442,7 +428,6 @@
 not_enough_positional_arguments_test/07: MissingCompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
-override_field_test/01: MissingCompileTimeError
 positional_parameters_type_test/01: MissingCompileTimeError
 positional_parameters_type_test/02: MissingCompileTimeError
 private_super_constructor_test/01: MissingCompileTimeError
@@ -462,8 +447,6 @@
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: RuntimeError # Issue 26429
 regress_31057_test: Crash # Unsupported operation: Unsupported type parameter type node B.
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
@@ -519,11 +502,9 @@
 async_await_test/none: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError
 async_star_test/02: RuntimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 compile_time_constant_o_test/01: MissingCompileTimeError
@@ -579,14 +560,8 @@
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
 f_bounded_quantification4_test: RuntimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 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
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -608,9 +583,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 if_null_precedence_test/none: RuntimeError
 infinity_test: RuntimeError # non JS number semantics - Issue 4984
@@ -637,9 +609,6 @@
 local_function2_test/none: RuntimeError
 local_function3_test/none: RuntimeError
 local_function_test/none: RuntimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -727,7 +696,6 @@
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
-override_field_test/01: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
 override_inheritance_field_test/26: CompileTimeError
@@ -749,8 +717,6 @@
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
 regress_30339_test: CompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
@@ -870,16 +836,12 @@
 async_star_cancel_while_paused_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 async_star_test/02: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
 check_member_static_test/01: MissingCompileTimeError
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 class_literal_static_test/01: MissingCompileTimeError
@@ -953,15 +915,9 @@
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
 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_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 flatten_test/05: MissingRuntimeError
@@ -988,10 +944,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
-getter_override_test/03: MissingCompileTimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
@@ -1046,10 +998,6 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
-method_override7_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -1165,7 +1113,6 @@
 null_no_such_method_test: CompileTimeError
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
-override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
@@ -1203,10 +1150,6 @@
 regress_30339_test: CompileTimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
@@ -1352,9 +1295,6 @@
 async_star_cancel_while_paused_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
 async_star_test/02: RuntimeError
 await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test: RuntimeError
 branch_canonicalization_test: RuntimeError
 call_non_method_field_test/01: MissingCompileTimeError
@@ -1362,7 +1302,6 @@
 call_with_no_such_method_test: RuntimeError
 canonical_const2_test: RuntimeError, OK # non JS number semantics
 check_member_static_test/01: MissingCompileTimeError
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 class_literal_static_test/01: MissingCompileTimeError
@@ -1431,15 +1370,9 @@
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field3_test/01: MissingCompileTimeError
 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_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 flatten_test/05: MissingRuntimeError
@@ -1466,10 +1399,6 @@
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
 generic_tearoff_test: CompileTimeError
-getter_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
-getter_override_test/03: MissingCompileTimeError
 identical_closure2_test: RuntimeError # non JS number semantics
 identical_const_test/01: MissingCompileTimeError
 identical_const_test/02: MissingCompileTimeError
@@ -1527,10 +1456,6 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
-method_override7_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError
 minify_closure_variable_collision_test: CompileTimeError
 mint_arithmetic_test: RuntimeError # non JS number semantics
@@ -1652,7 +1577,6 @@
 number_identity2_test: RuntimeError
 numbers_test: RuntimeError, OK # non JS number semantics
 overridden_no_such_method_test: RuntimeError
-override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_field_test/03: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
@@ -1688,10 +1612,6 @@
 regress_30339_test: CompileTimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 stack_trace_test: RuntimeError, OK # Stack trace not preserved in minified code.
 stacktrace_demangle_ctors_test: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 7160089..83843ad 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -33,6 +33,8 @@
 conflicting_type_variable_and_setter_test: CompileTimeError
 const_cast2_test/01: CompileTimeError
 const_cast2_test/none: CompileTimeError
+const_constructor_mixin3_test/01: MissingCompileTimeError # Issue 33644
+const_constructor_mixin_test/01: MissingCompileTimeError # Issue 33644
 const_for_in_variable_test/01: MissingCompileTimeError
 const_types_test/07: MissingCompileTimeError
 const_types_test/08: MissingCompileTimeError
@@ -102,6 +104,7 @@
 issue32353_test: RuntimeError
 label_test: RuntimeError
 left_shift_test: RuntimeError # Ints and doubles are unified.
+method_override7_test/03: MissingCompileTimeError
 method_override_test: CompileTimeError # Negative test
 mixin_super_2_test/01: MissingCompileTimeError
 mixin_super_2_test/03: MissingCompileTimeError
@@ -318,9 +321,6 @@
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
 async_return_types_test/nestedFuture: MissingCompileTimeError
 async_return_types_test/wrongReturnType: MissingCompileTimeError
-bad_override_test/01: MissingCompileTimeError
-bad_override_test/02: MissingCompileTimeError
-bad_override_test/03: MissingCompileTimeError
 bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 bit_operations_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 bit_operations_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -335,7 +335,6 @@
 call_non_method_field_test/01: MissingCompileTimeError
 call_non_method_field_test/02: MissingCompileTimeError
 check_member_static_test/01: MissingCompileTimeError
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 compile_time_constant_c_test/02: MissingCompileTimeError
@@ -395,13 +394,7 @@
 f_bounded_quantification_test/01: MissingCompileTimeError
 f_bounded_quantification_test/02: MissingCompileTimeError
 factory4_test/00: MissingCompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field_initialization_order_test/01: MissingCompileTimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: MissingCompileTimeError
 field_override_test/00: MissingCompileTimeError
 field_override_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
@@ -415,10 +408,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_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
-getter_override_test/03: MissingCompileTimeError
 guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 identical_closure2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 identical_const_test/01: MissingCompileTimeError
@@ -466,9 +455,6 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
 method_override_test: CompileTimeError # Issue 31616
 mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 mint_compares_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -546,7 +532,6 @@
 mixin_supertype_subclass_test/05: MissingCompileTimeError
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
-mock_writable_final_field_test: RuntimeError # Issue 30847
 mock_writable_final_private_field_test: RuntimeError
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
@@ -555,7 +540,6 @@
 no_such_method_mock_test: RuntimeError # Issue 31426 - Kernel does not introduce nSM for implemented fields.
 null_no_such_method_test: CompileTimeError # Issue 31533
 number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-override_field_test/01: MissingCompileTimeError
 override_field_test/02: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
 override_inheritance_field_test/06: CompileTimeError # Issue 31616
@@ -584,10 +568,6 @@
 regress_30339_test: CompileTimeError
 setter4_test: MissingCompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 string_split_test: CompileTimeError # Issue 31616
 string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
@@ -714,7 +694,6 @@
 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.
-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
 multiline_newline_test/04: MissingCompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 533ae5ff..b54747c 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -124,7 +124,6 @@
 mixin_illegal_superclass_test/28: MissingCompileTimeError
 mixin_illegal_superclass_test/29: MissingCompileTimeError
 mixin_illegal_superclass_test/30: MissingCompileTimeError
-mock_writable_final_private_field_test: RuntimeError
 named_parameters_default_eq_test/none: RuntimeError
 nested_generic_closure_test: RuntimeError
 no_main_test/01: Crash
@@ -169,6 +168,7 @@
 [ $compiler == dartkp ]
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
+constant_string_interpolation2_test: DartkCrash # Issue 33628
 covariant_subtyping_test: RuntimeError
 duplicate_implements_test/01: MissingCompileTimeError
 duplicate_implements_test/02: MissingCompileTimeError
@@ -226,8 +226,6 @@
 async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError # Issue 33068
 async_return_types_test/nestedFuture: MissingCompileTimeError # Issue 33068
 async_return_types_test/wrongReturnType: MissingCompileTimeError # Issue 33068
-bad_override_test/01: MissingCompileTimeError # Issue 32984
-bad_override_test/02: MissingCompileTimeError # Issue 32984
 call_non_method_field_test/01: MissingCompileTimeError # Issue 32975
 call_non_method_field_test/02: MissingCompileTimeError # Issue 32975
 check_member_static_test/01: MissingCompileTimeError # Issue 32613
@@ -264,7 +262,6 @@
 generic_methods_bounds_test/01: MissingCompileTimeError # Issue 33018
 generic_methods_overriding_test/01: MissingCompileTimeError # Issue 32613
 generic_methods_recursive_bound_test/02: MissingCompileTimeError # Issue 33018
-getter_override_test/03: MissingCompileTimeError # Issue 32984
 issue31596_override_test/07: MissingCompileTimeError
 issue31596_override_test/08: MissingCompileTimeError
 issue31596_super_test/02: MissingCompileTimeError
@@ -285,7 +282,6 @@
 malbounded_type_test_test/00: MissingCompileTimeError # Issue 33018
 malbounded_type_test_test/01: MissingCompileTimeError # Issue 33018
 malbounded_type_test_test/02: MissingCompileTimeError # Issue 33018
-method_override7_test/03: MissingCompileTimeError # Issue 32984
 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
@@ -338,8 +334,6 @@
 regress_29784_test/01: MissingCompileTimeError
 regress_29784_test/02: MissingCompileTimeError
 setter4_test: MissingCompileTimeError # Issue 14736
-setter_override_test/01: MissingCompileTimeError
-setter_override_test/02: MissingCompileTimeError
 switch_bad_case_test/01: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_bad_case_test/02: MissingCompileTimeError # KernelVM bug: Constant evaluation.
 switch_case_test/00: MissingCompileTimeError # KernelVM bug: Constant evaluation.
@@ -797,12 +791,11 @@
 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
-mock_writable_final_private_field_test: RuntimeError # Issue 30849
 named_constructor_test/01: MissingRuntimeError # Fasta bug: Bad compilation of constructor reference.
 named_parameters_default_eq_test/none: RuntimeError
 nested_generic_closure_test: RuntimeError
-no_main_test/01: DartkCrash
 no_main_test/01: Skip
+no_main_test/01: DartkCrash
 no_such_method_mock_test: RuntimeError # Issue 31426
 null_no_such_method_test: CompileTimeError # Issue 31533
 override_inheritance_field_test/04: CompileTimeError # Issue 31616
@@ -839,6 +832,7 @@
 type_promotion_functions_test/none: CompileTimeError # Issue 31537
 type_promotion_logical_and_test/01: MissingCompileTimeError
 type_promotion_more_specific_test/04: CompileTimeError # Issue 31533
+vm/bool_check_stack_traces_test/02: RuntimeError # Issue 33584
 vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
 vm/regress_29145_test: Skip # Issue 29145
 vm/type_cast_vm_test: RuntimeError
@@ -907,6 +901,8 @@
 type_alias_equality_test/02: RuntimeError # Issue 31359
 type_alias_equality_test/03: RuntimeError # Issue 31359
 type_alias_equality_test/04: RuntimeError # Issue 31359
+vm/bool_check_stack_traces_test/01: RuntimeError # Issue 33584
+vm/bool_check_stack_traces_test/02: RuntimeError # Issue 33584
 
 [ $compiler == dartkp && $runtime == dart_precompiled && $checked && $strong ]
 assert_initializer_test/31: MissingCompileTimeError # KernelVM bug: Constant evaluation.
@@ -1008,13 +1004,11 @@
 async_star_cancel_while_paused_test: RuntimeError
 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.
 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
 call_method_must_not_be_field_test/03: RuntimeError # Issue 32265
 call_method_must_not_be_getter_test/03: RuntimeError # Issue 32265
-check_member_static_test/02: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 checked_setter3_test/01: MissingCompileTimeError
 checked_setter3_test/02: MissingCompileTimeError
 checked_setter3_test/03: MissingCompileTimeError
@@ -1053,14 +1047,8 @@
 external_test/13: MissingRuntimeError # KernelVM bug: Unbound external.
 external_test/20: MissingRuntimeError # KernelVM bug: Unbound external.
 factory3_test/01: Pass
-fauxverride_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-fauxverride_test/05: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 field_increment_bailout_test: SkipByDesign
 field_initialization_order_test: Fail, OK
-field_override3_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-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.
 flatten_test/05: MissingRuntimeError
 flatten_test/08: MissingRuntimeError
 flatten_test/09: MissingRuntimeError
@@ -1077,9 +1065,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_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.
 hello_dart_test: Skip # Incompatible flag: --compile_all
 implicit_closure_test: Skip # Incompatible flag: --use_slow_path
 implicit_downcast_during_assignment_test: Pass # Correctly passes.
@@ -1132,13 +1117,9 @@
 method_override6_test/01: MissingCompileTimeError
 method_override6_test/02: MissingCompileTimeError
 method_override6_test/03: MissingCompileTimeError
-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_override_test: CompileTimeError # Issue 31616
 mixin_illegal_super_use_test: Skip # Issues 24478 and 23773
 mixin_illegal_superclass_test: Skip # Issues 24478 and 23773
-mock_writable_final_private_field_test: RuntimeError # Issue 30849
 named_parameters_default_eq_test/none: RuntimeError
 nested_generic_closure_test: RuntimeError
 no_main_test/01: Skip
@@ -1148,7 +1129,6 @@
 null_test/mirrors: Skip # Uses mirrors.
 null_test/none: SkipByDesign
 overridden_no_such_method_test: SkipByDesign
-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
 override_inheritance_field_test/26: CompileTimeError # Issue 31616
@@ -1171,8 +1151,6 @@
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
 regress_30339_test: CompileTimeError # Issue 31402 (Variable declaration)
 setter_no_getter_test/01: Pass, CompileTimeError # Issue 31533 (started passing after switching to batch-mode)
-setter_override_test/00: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
-setter_override_test/03: MissingCompileTimeError # Issue 32613: override check is missing in CFE.
 stacktrace_demangle_ctors_test: RuntimeError
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
 string_split_test: CompileTimeError # Issue 31616
@@ -1260,8 +1238,6 @@
 map_literal3_test/02: MissingCompileTimeError
 
 [ $compiler == fasta && $strong ]
-bad_override_test/03: MissingCompileTimeError
-check_member_static_test/02: MissingCompileTimeError
 class_cycle_test/02: MissingCompileTimeError
 class_cycle_test/03: MissingCompileTimeError
 compile_time_constant_static4_test/02: MissingCompileTimeError
@@ -1284,28 +1260,16 @@
 export_ambiguous_main_test: MissingCompileTimeError
 external_test/21: CompileTimeError
 external_test/24: CompileTimeError
-fauxverride_test/03: MissingCompileTimeError
-fauxverride_test/05: MissingCompileTimeError
 field_initialization_order_test/01: MissingCompileTimeError
-field_override3_test/00: MissingCompileTimeError
-field_override3_test/01: MissingCompileTimeError
-field_override3_test/02: MissingCompileTimeError
-field_override3_test/03: 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_override_test/00: MissingCompileTimeError
-getter_override_test/01: MissingCompileTimeError
-getter_override_test/02: MissingCompileTimeError
 instantiate_tearoff_of_call_test: CompileTimeError
 issue31596_super_test/01: CompileTimeError
 issue31596_super_test/03: CompileTimeError
-method_override7_test/00: MissingCompileTimeError
-method_override7_test/01: MissingCompileTimeError
-method_override7_test/02: MissingCompileTimeError
 method_override_test: CompileTimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
@@ -1349,7 +1313,6 @@
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
 null_no_such_method_test: CompileTimeError
-override_field_test/01: MissingCompileTimeError
 override_inheritance_field_test/04: CompileTimeError
 override_inheritance_field_test/06: CompileTimeError
 override_inheritance_field_test/26: CompileTimeError
@@ -1363,8 +1326,6 @@
 regress_29405_test: CompileTimeError
 regress_30339_test: CompileTimeError
 setter_no_getter_test/01: CompileTimeError
-setter_override_test/00: MissingCompileTimeError
-setter_override_test/03: MissingCompileTimeError
 string_split_test: CompileTimeError
 string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
@@ -1494,6 +1455,8 @@
 bad_named_parameters_test/03: MissingCompileTimeError
 bad_named_parameters_test/04: MissingCompileTimeError
 bad_named_parameters_test/05: MissingCompileTimeError
+bad_override_test/01: MissingCompileTimeError
+bad_override_test/02: MissingCompileTimeError
 bad_override_test/03: MissingCompileTimeError
 bad_override_test/06: MissingCompileTimeError
 built_in_identifier_type_annotation_test/dynamic-gen: MissingCompileTimeError
@@ -1736,6 +1699,7 @@
 getter_override_test/00: MissingCompileTimeError
 getter_override_test/01: MissingCompileTimeError
 getter_override_test/02: MissingCompileTimeError
+getter_override_test/03: MissingCompileTimeError
 getters_setters2_test/02: MissingCompileTimeError
 if_null_assignment_behavior_test/03: MissingCompileTimeError
 if_null_assignment_behavior_test/13: MissingCompileTimeError
@@ -1892,6 +1856,7 @@
 method_override7_test/00: MissingCompileTimeError
 method_override7_test/01: MissingCompileTimeError
 method_override7_test/02: MissingCompileTimeError
+method_override7_test/03: MissingCompileTimeError
 mixin_illegal_constructor_test/13: MissingCompileTimeError
 mixin_illegal_constructor_test/14: MissingCompileTimeError
 mixin_illegal_constructor_test/15: MissingCompileTimeError
@@ -2078,7 +2043,10 @@
 return_type_test: MissingCompileTimeError
 rewrite_implicit_this_test/01: MissingCompileTimeError
 setter_no_getter_call_test/01: MissingCompileTimeError
+setter_override2_test/02: MissingCompileTimeError
 setter_override_test/00: MissingCompileTimeError
+setter_override_test/01: MissingCompileTimeError
+setter_override_test/02: MissingCompileTimeError
 setter_override_test/03: MissingCompileTimeError
 static_call_wrong_argument_count_negative_test: Fail
 static_field1_test/01: MissingCompileTimeError
diff --git a/tests/language_2/vm/bool_check_stack_traces_test.dart b/tests/language_2/vm/bool_check_stack_traces_test.dart
new file mode 100644
index 0000000..cd80936
--- /dev/null
+++ b/tests/language_2/vm/bool_check_stack_traces_test.dart
@@ -0,0 +1,103 @@
+// 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:expect/expect.dart";
+
+class Test1 {
+  void bar(bool condition) {
+    if (condition) {
+      Expect.fail('Should not reach here');
+    }
+    Expect.fail('Should throw earlier');
+  }
+}
+
+void test1(bool condition) {
+  Test1 obj = new Test1();
+  obj.bar(condition);
+}
+
+class Test2 {
+  bool condition;
+  Test2(this.condition);
+
+  void bar() {
+    if (!condition) {
+      Expect.fail('Should not reach here');
+    }
+    Expect.fail('Should throw earlier');
+  }
+}
+
+void test2(bool condition) {
+  Test2 obj = new Test2(condition);
+  obj.bar();
+}
+
+class Test3 {
+  bool condition;
+  Test3(this.condition);
+
+  bool bazz() => condition;
+
+  void bar() {
+    while (bazz() || bazz()) {
+      Expect.fail('Should not reach here');
+    }
+    Expect.fail('Should throw earlier');
+  }
+}
+
+void test3(bool condition) {
+  Test3 obj = new Test3(condition);
+  obj.bar();
+}
+
+const bool test4Condition = null;
+
+void test4(bool condition) {
+  if (test4Condition) {
+    Expect.fail('Should not reach here');
+  }
+  Expect.fail('Should throw earlier');
+}
+
+void test5(bool condition) {
+  if (null) {
+    Expect.fail('Should not reach here');
+  }
+  Expect.fail('Should throw earlier');
+}
+
+void testStackTrace(void testCase(bool condition), List<int> lineNumbers) {
+  try {
+    testCase(null);
+    Expect.fail("Using null in a bool condition should throw TypeError");
+  } catch (e, stacktrace) {
+    print('--------- exception ---------');
+    print(e);
+    print('-------- stack trace --------');
+    print(stacktrace);
+    print('-----------------------------');
+
+    Expect.isTrue(e is AssertionError);
+    Expect.equals(
+        'Failed assertion: boolean expression must not be null', e.toString());
+
+    final String st = stacktrace.toString();
+    for (int lineNum in lineNumbers) {
+      String item = '.dart:$lineNum';
+      Expect.isTrue(st.contains(item), "Stack trace doesn't contain $item");
+    }
+    print('OK');
+  }
+}
+
+main() {
+  testStackTrace(test1, [9, 18]);
+  testStackTrace(test2, [26, 35]);
+  testStackTrace(test3, [45, 54]);
+  testStackTrace(test4, [60]); //# 01: ok
+  testStackTrace(test5, [67]); //# 02: ok
+}
diff --git a/tests/language_2/void/return_future_future_or_void_async_test.dart b/tests/language_2/void/return_future_future_or_void_async_test.dart
index 81fb4da..68b65ad 100644
--- a/tests/language_2/void/return_future_future_or_void_async_test.dart
+++ b/tests/language_2/void/return_future_future_or_void_async_test.dart
@@ -8,8 +8,6 @@
 
 void main() {
   test1();
-  test2();
-  test3();
   test4();
   test5();
   test6();
@@ -20,16 +18,6 @@
 // Testing that a block bodied async function may have no return
 Future<FutureOr<void>> test1() async {}
 
-// Testing that a block bodied async function may return Future<void>
-Future<FutureOr<void>> test2([bool b]) async {
-  return null as Future<void>;
-}
-
-// Testing that a block bodied async function may return FutureOr<void>
-Future<FutureOr<void>> test3([bool b]) async {
-  return null as FutureOr<void>;
-}
-
 // Testing that a block bodied async function may return Future<FutureOr<void>>
 Future<FutureOr<void>> test4([bool b]) async {
   return null as Future<FutureOr<void>>;
@@ -54,5 +42,5 @@
 // Testing that a block bodied async function may return non-void
 // Future values
 Future<FutureOr<void>> test8() async {
-  return new Future.value(42);
+  return new Future<int>.value(42);
 }
diff --git a/tests/language_2/void/return_future_or_void_async_error0_test.dart b/tests/language_2/void/return_future_or_void_async_error0_test.dart
deleted file mode 100644
index c5115a7..0000000
--- a/tests/language_2/void/return_future_or_void_async_error0_test.dart
+++ /dev/null
@@ -1,16 +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 'dart:async';
-
-void voidValue = null;
-
-void main() {
-  test();
-}
-
-// Testing that a block bodied function may not return void
-FutureOr<void> test() async {
-  return /*@compile-error=unspecified*/ voidValue;
-}
diff --git a/tests/language_2/void/return_future_or_void_async_test.dart b/tests/language_2/void/return_future_or_void_async_test.dart
index dfdf1e7..151f337 100644
--- a/tests/language_2/void/return_future_or_void_async_test.dart
+++ b/tests/language_2/void/return_future_or_void_async_test.dart
@@ -11,8 +11,7 @@
   test1();
   test2();
   test3();
-  test4();
-  test5();
+  test6();
 }
 
 // Testing that a block bodied function may have an empty return
@@ -33,14 +32,7 @@
   return null as FutureOr<void>;
 }
 
-// Testing that a block bodied async function may return non-void
-// values
-FutureOr<void> test4() async {
-  return 42;
-}
-
-// Testing that a block bodied async function may return non-void
-// Future values
-FutureOr<void> test5() async {
-  return new Future.value(42);
+// Testing that a block bodied function may return void
+FutureOr<void> test6() async {
+  return voidValue;
 }
diff --git a/tests/language_2/void/return_future_void_async_error2_test.dart b/tests/language_2/void/return_future_void_async_error2_test.dart
deleted file mode 100644
index d31263e..0000000
--- a/tests/language_2/void/return_future_void_async_error2_test.dart
+++ /dev/null
@@ -1,16 +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 'dart:async';
-
-void voidValue = null;
-
-void main() {
-  test();
-}
-
-// Testing that a block bodied async function may return void
-Future<void> test() async {
-  return /*@compile-error=unspecified*/ voidValue;
-}
diff --git a/tests/language_2/void/return_future_void_async_test.dart b/tests/language_2/void/return_future_void_async_test.dart
index ba3f1f1..dae62ed 100644
--- a/tests/language_2/void/return_future_void_async_test.dart
+++ b/tests/language_2/void/return_future_void_async_test.dart
@@ -34,20 +34,17 @@
   return null as FutureOr<void>;
 }
 
-// Testing that a block bodied async function may return non-void
-// values
-Future<void> test4() async {
-  return 42;
+// Testing that a block bodied async function may return null
+Future<void> test4([bool b]) async {
+  return null;
 }
 
-// Testing that a block bodied async function may return non-void
-// Future values
-Future<void> test5() async {
-  return new Future.value(42);
+// Testing that a block bodied async function may return dynamic
+Future<void> test5([bool b]) async {
+  return null as dynamic;
 }
 
-// Testing that a block bodied async function return nested void
-// Future values
+// Testing that a block bodied async function return void
 Future<void> test6() async {
-  return null as Future<Future<void>>;
+  return voidValue;
 }
diff --git a/tests/language_2/void/return_void_async_error3_test.dart b/tests/language_2/void/return_void_async_error3_test.dart
deleted file mode 100644
index 27e691b..0000000
--- a/tests/language_2/void/return_void_async_error3_test.dart
+++ /dev/null
@@ -1,14 +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 'dart:async';
-
-void main() {
-  test();
-}
-
-// Testing that a block bodied async function may not return Future<void>
-void test() async {
-  return /*@compile-error=unspecified*/ null as Future<void>;
-}
diff --git a/tests/language_2/void/return_void_async_test.dart b/tests/language_2/void/return_void_async_test.dart
index bf10b9c..2f9966b 100644
--- a/tests/language_2/void/return_void_async_test.dart
+++ b/tests/language_2/void/return_void_async_test.dart
@@ -11,6 +11,8 @@
   test1();
   test2();
   test3();
+  test4();
+  test5();
 }
 
 // Testing that a block bodied async function may have an empty return
@@ -35,3 +37,13 @@
     return voidValue;
   }
 }
+
+// Testing that a block bodied async function may return Null
+void test4() async {
+  return null;
+}
+
+// Testing that a block bodied async function may return dynamic
+void test5() async {
+  return null as dynamic;
+}
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index be289b1..a80c78b 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -6,6 +6,9 @@
 # listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
 # prefix.
 io/http_close_test: Pass, RuntimeError # Issue 28380
+io/non_utf8_directory_test: Skip # Issue 33519. Temp files causing bots to go purple.
+io/non_utf8_file_test: Skip # Issue 33519. Temp files causing bots to go purple.
+io/non_utf8_link_test: Skip # Issue 33519. Temp files causing bots to go purple.
 io/raw_socket_test: Pass, RuntimeError # Issue 28288
 issue14236_test: Pass # Do not remove this line. It serves as a marker for Issue 14516 comment #4.
 package/invalid_uri_test: Fail, OK # CompileTimeErrors intentionally
diff --git a/tools/VERSION b/tools/VERSION
index bbc4468..bbe378c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 0
 PATCH 0
-PRERELEASE 65
+PRERELEASE 66
 PRERELEASE_PATCH 0
diff --git a/tools/sdks/linux/dart-sdk.tar.gz.sha1 b/tools/sdks/linux/dart-sdk.tar.gz.sha1
index e12fb60..f888b4d 100644
--- a/tools/sdks/linux/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/linux/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-cb26a440fbe1a3cef64c580ee9055a746278ea82
\ No newline at end of file
+739732637a9d7a2cbd04beb36c4d117d615fd22c
\ No newline at end of file
diff --git a/tools/sdks/mac/dart-sdk.tar.gz.sha1 b/tools/sdks/mac/dart-sdk.tar.gz.sha1
index 03cf63f..0db4273 100644
--- a/tools/sdks/mac/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/mac/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-c66ec04f2b2e00c30b307eb2275a2bd91fa97287
\ No newline at end of file
+80c81b7d814e5897b8350b6f2a3b60353080ca45
\ No newline at end of file
diff --git a/tools/sdks/win/dart-sdk.tar.gz.sha1 b/tools/sdks/win/dart-sdk.tar.gz.sha1
index 361bfca..3b0ea4f 100644
--- a/tools/sdks/win/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/win/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-26a6441397eea6cf00c7b3e565de4aa40c43a9c6
\ No newline at end of file
+5dbee047c7824357eb7e6581cd69687a623449ab
\ No newline at end of file
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 757ef01..c474bd7 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -1011,8 +1011,10 @@
     } else {
       arguments.add('--no-strong');
     }
-    if (_configuration.compiler == Compiler.dart2analyzer &&
-        _configuration.usesFasta) {
+    if (_configuration.useAnalyzerCfe) {
+      arguments.add('--use-cfe');
+    }
+    if (_configuration.useAnalyzerFastaParser) {
       arguments.add('--use-fasta-parser');
     }
 
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index e78b2d4..80808c3 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -46,6 +46,8 @@
       this.reportInJson,
       this.resetBrowser,
       this.skipCompilation,
+      this.useAnalyzerCfe,
+      this.useAnalyzerFastaParser,
       this.useBlobs,
       this.useSdk,
       this.useFastStartup,
@@ -120,6 +122,8 @@
   final bool reportInJson;
   final bool resetBrowser;
   final bool skipCompilation;
+  final bool useAnalyzerCfe;
+  final bool useAnalyzerFastaParser;
   final bool useBlobs;
   final bool useSdk;
   final bool useFastStartup;
@@ -194,7 +198,7 @@
     return fastaCompilers.contains(compiler) ||
         (compiler == Compiler.dart2js && !useDart2JSOldFrontend) ||
         (compiler == Compiler.dart2analyzer &&
-            builderTag == 'analyzer_use_fasta');
+            (builderTag == 'analyzer_use_fasta' || useAnalyzerCfe));
   }
 
   /// The base directory named for this configuration, like:
@@ -471,6 +475,8 @@
         'fast_startup': useFastStartup,
         'timeout': timeout,
         'no_preview_dart_2': noPreviewDart2,
+        'use_cfe': useAnalyzerCfe,
+        'analyzer_use_fasta_parser': useAnalyzerFastaParser,
         'dart2js_with_kernel': useDart2JSWithKernel,
         'dart2js_old_frontend': useDart2JSOldFrontend,
         'enable_asserts': useEnableAsserts,
diff --git a/tools/testing/dart/environment.dart b/tools/testing/dart/environment.dart
index 55397f8..f0bda0dd 100644
--- a/tools/testing/dart/environment.dart
+++ b/tools/testing/dart/environment.dart
@@ -13,6 +13,8 @@
 // consider adding support for "!" to status expressions.
 final _variables = {
   "analyzer": new _Variable.bool((c) => c.compiler == Compiler.dart2analyzer),
+  "analyzer_use_fasta_parser":
+      new _Variable.bool((c) => c.useAnalyzerFastaParser),
   "arch": new _Variable((c) => c.architecture.name, Architecture.names),
   "browser": new _Variable.bool((c) => c.runtime.isBrowser),
   "builder_tag": new _Variable((c) => c.builderTag ?? "", const []),
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 5296bd1..fb29a71 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -173,6 +173,12 @@
     new _Option.bool(
         'no_preview_dart_2', 'Pass the --no-preview-dart-2 flag to analyzer',
         hide: true),
+    new _Option.bool('use_cfe', 'Pass the --use-cfe flag to analyzer',
+        hide: true),
+    new _Option.bool('analyzer_use_fasta_parser',
+        'Pass the --use-fasta-parser flag to analyzer',
+        hide: true),
+
     // TODO(sigmund): replace dart2js_with_kernel with preview-dart-2.
     new _Option.bool(
         'dart2js_with_kernel', 'Pass the --use-kernel flag to dart2js.',
@@ -656,6 +662,9 @@
                 reportInJson: data["report_in_json"] as bool,
                 resetBrowser: data["reset_browser_configuration"] as bool,
                 skipCompilation: data["skip_compilation"] as bool,
+                useAnalyzerCfe: data["use_cfe"] as bool,
+                useAnalyzerFastaParser:
+                    data["analyzer_use_fasta_parser"] as bool,
                 useBlobs: data["use_blobs"] as bool,
                 useSdk: data["use_sdk"] as bool,
                 useFastStartup: data["fast_startup"] as bool,