Version 2.17.0-37.0.dev

Merge commit 'd9b69e907eed1b92a436f7688d5222c8e8d87be5' into 'dev'
diff --git a/DEPS b/DEPS
index b13d2dc..cfd0829 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "143ad7f74919b132951e447a547236e991d9f900",
+  "co19_rev": "73fa4da0cb5a6fec136a2ac045503770eed2b58f",
   # This line prevents conflicts when both packages are rolled simultaneously.
   "co19_2_rev": "995745937abffe9fc3a6441f9f0db27b2d706e4c",
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart b/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
index 7bc929b..4e453145 100644
--- a/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
@@ -42,8 +42,8 @@
 ///   - a top level entry for each target. Keys are target names (e.g. "vm"
 ///     above), and values contain the entire specification of a target.
 ///
-///   - each target specification is a map. Today, only one key is supported on
-///     this map: "libraries".
+///   - each target specification is a map. The supported keys are "libraries"
+///     and "include".
 ///
 ///   - The "libraries" entry contains details for how each platform library is
 ///     implemented. The entry is a map, where keys are the name of the platform
@@ -79,6 +79,30 @@
 ///     Internal libraries are never supported through conditional imports and
 ///     const `fromEnvironment` expressions.
 ///
+///   - The "include" entry is a list of maps, each containing either a "path"
+///     and a "target" entry, or only a "target" entry.
+///
+///     If both "path" and "target" entries are present, the libraries
+///     specification file located at "path", relative to the location current
+///     libraries specification file is loaded, and the libraries defined
+///     in the target with the target name of the "target" entry are included in
+///     this target.
+///
+///     If only the "target" is present, the libraries in the target in the
+///     current libraries specification file with the target name of the
+///     "target" entry are included in this target.
+///
+///     The "include" mechanism support transitive inclusion but doesn't allow
+///     cyclic dependencies.
+///
+///     If the same library is defined in multiple included target
+///     specifications, the last included takes precedence. This means that
+///     if a target specification include a library and also defines it itself,
+///     the latter is used.
+///
+///     Currently it is not supported to include a subset of the libraries from
+///     an included target specifications.
+///
 ///
 /// Note: we currently have several different files that need to be updated
 /// when changing libraries, sources, and patch files:
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 4576ec6..814b523 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -137,6 +137,14 @@
       /* charOffset = */ null,
       instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
 
+  final NamedTypeBuilder enumType = new NamedTypeBuilder(
+      "Enum",
+      const NullabilityBuilder.omitted(),
+      /* arguments = */ null,
+      /* fileUri = */ null,
+      /* charOffset = */ null,
+      instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
+
   final bool excludeSource = !CompilerContext.current.options.embedSourceText;
 
   final Map<String, String>? environmentDefines =
@@ -406,6 +414,7 @@
           link(new List<Library>.from(loader.libraries), nameRoot: nameRoot);
       computeCoreTypes();
       loader.buildClassHierarchy(sourceClassBuilders, objectClassBuilder);
+      loader.checkSupertypes(sourceClassBuilders, enumClass);
       // TODO(johnniwinther): Enable this when supported in the isolate-based
       //  macro executor.
       /*if (macroApplications != null) {
@@ -416,7 +425,6 @@
       loader.computeShowHideElements();
       loader.installTypedefTearOffs();
       loader.performTopLevelInference(sourceClassBuilders);
-      loader.checkSupertypes(sourceClassBuilders);
       loader.checkOverrides(sourceClassBuilders);
       loader.checkAbstractMembers(sourceClassBuilders);
       loader.addNoSuchMethodForwarders(sourceClassBuilders);
@@ -648,6 +656,10 @@
 
   Class get objectClass => objectClassBuilder.cls;
 
+  ClassBuilder get enumClassBuilder => enumType.declaration as ClassBuilder;
+
+  Class get enumClass => enumClassBuilder.cls;
+
   /// If [builder] doesn't have a constructors, install the defaults.
   void installDefaultConstructor(SourceClassBuilder builder) {
     assert(!builder.isMixinApplication);
@@ -976,6 +988,8 @@
     nullType.bind(nullClassBuilder..isNullClass = true);
     bottomType.bind(loader.coreLibrary
         .lookupLocalMember("Never", required: true) as TypeDeclarationBuilder);
+    enumType.bind(loader.coreLibrary.lookupLocalMember("Enum", required: true)
+        as TypeDeclarationBuilder);
   }
 
   void computeCoreTypes() {
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 4e4540e..fb348d8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -40,6 +40,7 @@
 import '../dill/dill_member_builder.dart';
 import '../fasta_codes.dart';
 import '../kernel/combined_member_signature.dart';
+import '../kernel/hierarchy/hierarchy_builder.dart';
 import '../kernel/kernel_helper.dart';
 import '../kernel/kernel_target.dart' show KernelTarget;
 import '../kernel/redirecting_factory_body.dart'
@@ -621,12 +622,34 @@
     }
   }
 
-  void checkSupertypes(CoreTypes coreTypes) {
+  void checkSupertypes(CoreTypes coreTypes,
+      ClassHierarchyBuilder hierarchyBuilder, Class enumClass) {
     // This method determines whether the class (that's being built) its super
     // class appears both in 'extends' and 'implements' clauses and whether any
     // interface appears multiple times in the 'implements' clause.
     // Moreover, it checks that `FutureOr` and `void` are not among the
-    // supertypes.
+    // supertypes and that `Enum` is not implemented by non-abstract classes.
+
+    if (!cls.isAbstract && !cls.isEnum) {
+      bool isEnumFound = false;
+      List<Supertype> interfaces =
+          hierarchyBuilder.getNodeFromClass(cls).superclasses;
+      for (int i = 0; !isEnumFound && i < interfaces.length; i++) {
+        if (interfaces[i].classNode == enumClass) {
+          isEnumFound = true;
+        }
+      }
+      interfaces = hierarchyBuilder.getNodeFromClass(cls).interfaces;
+      for (int i = 0; !isEnumFound && i < interfaces.length; i++) {
+        if (interfaces[i].classNode == enumClass) {
+          isEnumFound = true;
+        }
+      }
+      if (isEnumFound) {
+        addProblem(templateEnumSupertypeOfNonAbstractClass.withArguments(name),
+            charOffset, noLength);
+      }
+    }
 
     void fail(NamedTypeBuilder target, Message message,
         TypeAliasBuilder? aliasBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 0b7498f..a01a8c4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -4390,9 +4390,13 @@
     if (arguments.types.isEmpty) return;
     Class klass;
     List<DartType> receiverTypeArguments;
+    Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
     if (receiverType is InterfaceType) {
       klass = receiverType.classNode;
       receiverTypeArguments = receiverType.typeArguments;
+      for (int i = 0; i < receiverTypeArguments.length; ++i) {
+        substitutionMap[klass.typeParameters[i]] = receiverTypeArguments[i];
+      }
     } else {
       return;
     }
@@ -4408,10 +4412,12 @@
           hierarchy.getClassAsInstanceOf(klass, method.enclosingClass!)!;
       klass = method.enclosingClass!;
       receiverTypeArguments = parent.typeArguments;
-    }
-    Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
-    for (int i = 0; i < receiverTypeArguments.length; ++i) {
-      substitutionMap[klass.typeParameters[i]] = receiverTypeArguments[i];
+      Map<TypeParameter, DartType> instanceSubstitutionMap = substitutionMap;
+      substitutionMap = <TypeParameter, DartType>{};
+      for (int i = 0; i < receiverTypeArguments.length; ++i) {
+        substitutionMap[klass.typeParameters[i]] =
+            substitute(receiverTypeArguments[i], instanceSubstitutionMap);
+      }
     }
     List<TypeParameter> methodParameters = method.function.typeParameters;
     // The error is to be reported elsewhere.
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 9795167..e8b0af8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1713,20 +1713,12 @@
   bool checkEnumSupertypeIsDenylisted(SourceClassBuilder cls) {
     if (!cls.library.enableEnhancedEnumsInLibrary) {
       cls.addProblem(
-          templateExperimentNotEnabled.withArguments('enhanced-enums',
-              cls.library.enableEnhancedEnumsVersionInLibrary.toText()),
+          templateEnumSupertypeOfNonAbstractClass.withArguments(cls.name),
           cls.charOffset,
           noLength);
       return true;
-    } else {
-      if (!cls.isAbstract) {
-        cls.addProblem(
-            templateEnumSupertypeOfNonAbstractClass.withArguments(cls.name),
-            cls.charOffset,
-            noLength);
-      }
-      return false;
     }
+    return false;
   }
 
   void checkClassSupertypes(
@@ -1925,10 +1917,11 @@
     ticker.logMs("Computed core types");
   }
 
-  void checkSupertypes(List<SourceClassBuilder> sourceClasses) {
+  void checkSupertypes(
+      List<SourceClassBuilder> sourceClasses, Class enumClass) {
     for (SourceClassBuilder builder in sourceClasses) {
       if (builder.library.loader == this && !builder.isPatch) {
-        builder.checkSupertypes(coreTypes);
+        builder.checkSupertypes(coreTypes, hierarchyBuilder, enumClass);
       }
     }
     ticker.logMs("Checked supertypes");
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index b67f720..7ec217f 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1247,6 +1247,7 @@
 spec'ed
 specialization
 specially
+specifications
 specifics
 speeding
 spend
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart
index 7d0f370..8889a45 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart
@@ -10,4 +10,20 @@
   int get foo => index;
 }
 
+abstract class EnumInterface implements Enum {}
+
+class EnumClass extends EnumInterface { // Error.
+  int get index => 0;
+}
+
+abstract class AbstractEnumClass extends EnumInterface {}
+
+class EnumClass2 extends AbstractEnumClass {} // Error.
+
+mixin EnumMixin on Enum {}
+
+abstract class AbstractEnumClass2 with EnumMixin {}
+
+class EnumClass3 extends AbstractEnumClass2 {} // Error.
+
 main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.expect
index 8e7b231..99bdbbb 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.expect
@@ -10,6 +10,18 @@
 // class B implements Enum { // Error.
 //       ^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^
+//
 // pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
 //  - Enum.index
 // Try to either
@@ -38,6 +50,41 @@
 //   int get index;
 //           ^^^^^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Enum' is from 'dart:core'.
+//  - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+//                ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -59,6 +106,51 @@
   no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
 }
+abstract class EnumInterface extends core::Object implements core::Enum {
+  synthetic constructor •() → self::EnumInterface
+    : super core::Object::•()
+    ;
+}
+class EnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::EnumClass
+    : super self::EnumInterface::•()
+    ;
+  get index() → core::int
+    return 0;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::AbstractEnumClass
+    : super self::EnumInterface::•()
+    ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+  synthetic constructor •() → self::EnumClass2
+    : super self::AbstractEnumClass::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin = core::Object with self::EnumMixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+  synthetic constructor •() → self::AbstractEnumClass2
+    : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+    ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+  synthetic constructor •() → self::EnumClass3
+    : super self::AbstractEnumClass2::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.transformed.expect
index 8e7b231..9f0c21d 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.transformed.expect
@@ -10,6 +10,18 @@
 // class B implements Enum { // Error.
 //       ^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^
+//
 // pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
 //  - Enum.index
 // Try to either
@@ -38,6 +50,41 @@
 //   int get index;
 //           ^^^^^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Enum' is from 'dart:core'.
+//  - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+//                ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -59,6 +106,51 @@
   no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
 }
+abstract class EnumInterface extends core::Object implements core::Enum {
+  synthetic constructor •() → self::EnumInterface
+    : super core::Object::•()
+    ;
+}
+class EnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::EnumClass
+    : super self::EnumInterface::•()
+    ;
+  get index() → core::int
+    return 0;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::AbstractEnumClass
+    : super self::EnumInterface::•()
+    ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+  synthetic constructor •() → self::EnumClass2
+    : super self::AbstractEnumClass::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin extends core::Object implements self::EnumMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+  synthetic constructor •() → self::AbstractEnumClass2
+    : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+    ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+  synthetic constructor •() → self::EnumClass3
+    : super self::AbstractEnumClass2::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline.expect
index 585427e..91bd71d 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline.expect
@@ -6,4 +6,20 @@
   int get foo => index;
 }
 
+abstract class EnumInterface implements Enum {}
+
+class EnumClass extends EnumInterface {
+  int get index => 0;
+}
+
+abstract class AbstractEnumClass extends EnumInterface {}
+
+class EnumClass2 extends AbstractEnumClass {}
+
+mixin EnumMixin on Enum {}
+
+abstract class AbstractEnumClass2 with EnumMixin {}
+
+class EnumClass3 extends AbstractEnumClass2 {}
+
 main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline_modelled.expect
index 585427e..b8f73e5 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline_modelled.expect
@@ -1,3 +1,9 @@
+abstract class AbstractEnumClass extends EnumInterface {}
+
+abstract class AbstractEnumClass2 with EnumMixin {}
+
+abstract class EnumInterface implements Enum {}
+
 class A extends Enum {
   int get foo => index;
 }
@@ -6,4 +12,13 @@
   int get foo => index;
 }
 
+class EnumClass extends EnumInterface {
+  int get index => 0;
+}
+
+class EnumClass2 extends AbstractEnumClass {}
+
+class EnumClass3 extends AbstractEnumClass2 {}
+
 main() {}
+mixin EnumMixin on Enum {}
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.expect
index 8e7b231..99bdbbb 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.expect
@@ -10,6 +10,18 @@
 // class B implements Enum { // Error.
 //       ^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^
+//
 // pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
 //  - Enum.index
 // Try to either
@@ -38,6 +50,41 @@
 //   int get index;
 //           ^^^^^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Enum' is from 'dart:core'.
+//  - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+//                ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -59,6 +106,51 @@
   no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
 }
+abstract class EnumInterface extends core::Object implements core::Enum {
+  synthetic constructor •() → self::EnumInterface
+    : super core::Object::•()
+    ;
+}
+class EnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::EnumClass
+    : super self::EnumInterface::•()
+    ;
+  get index() → core::int
+    return 0;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::AbstractEnumClass
+    : super self::EnumInterface::•()
+    ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+  synthetic constructor •() → self::EnumClass2
+    : super self::AbstractEnumClass::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin = core::Object with self::EnumMixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+  synthetic constructor •() → self::AbstractEnumClass2
+    : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+    ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+  synthetic constructor •() → self::EnumClass3
+    : super self::AbstractEnumClass2::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.modular.expect
index 8e7b231..99bdbbb 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.modular.expect
@@ -10,6 +10,18 @@
 // class B implements Enum { // Error.
 //       ^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^
+//
 // pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
 //  - Enum.index
 // Try to either
@@ -38,6 +50,41 @@
 //   int get index;
 //           ^^^^^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Enum' is from 'dart:core'.
+//  - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+//                ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -59,6 +106,51 @@
   no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
 }
+abstract class EnumInterface extends core::Object implements core::Enum {
+  synthetic constructor •() → self::EnumInterface
+    : super core::Object::•()
+    ;
+}
+class EnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::EnumClass
+    : super self::EnumInterface::•()
+    ;
+  get index() → core::int
+    return 0;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::AbstractEnumClass
+    : super self::EnumInterface::•()
+    ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+  synthetic constructor •() → self::EnumClass2
+    : super self::AbstractEnumClass::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin = core::Object with self::EnumMixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+  synthetic constructor •() → self::AbstractEnumClass2
+    : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+    ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+  synthetic constructor •() → self::EnumClass3
+    : super self::AbstractEnumClass2::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.outline.expect
index 08bae2f..75296a2 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.outline.expect
@@ -10,6 +10,18 @@
 // class B implements Enum { // Error.
 //       ^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^
+//
 // pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
 //  - Enum.index
 // Try to either
@@ -38,6 +50,41 @@
 //   int get index;
 //           ^^^^^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Enum' is from 'dart:core'.
+//  - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+//                ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -57,6 +104,45 @@
   no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_name, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
 }
+abstract class EnumInterface extends core::Object implements core::Enum {
+  synthetic constructor •() → self::EnumInterface
+    ;
+}
+class EnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::EnumClass
+    ;
+  get index() → core::int
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_name, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::AbstractEnumClass
+    ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+  synthetic constructor •() → self::EnumClass2
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_name, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin = core::Object with self::EnumMixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+  synthetic constructor •() → self::AbstractEnumClass2
+    ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+  synthetic constructor •() → self::EnumClass3
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_name, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
 static method main() → dynamic
   ;
 
@@ -70,4 +156,16 @@
 Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <Type*>[])
 Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <dynamic>[])
 Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> MapConstant(const <Symbol*, dynamic>{})
-Extra constant evaluation: evaluated: 18, effectively constant: 8
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> SymbolConstant(#_name)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> SymbolConstant(#_name)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> SymbolConstant(#_name)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> MapConstant(const <Symbol*, dynamic>{})
+Extra constant evaluation: evaluated: 45, effectively constant: 20
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.transformed.expect
index 8e7b231..9f0c21d 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.transformed.expect
@@ -10,6 +10,18 @@
 // class B implements Enum { // Error.
 //       ^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^
+//
 // pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
 //  - Enum.index
 // Try to either
@@ -38,6 +50,41 @@
 //   int get index;
 //           ^^^^^
 //
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+//  - Enum.index
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+//       ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+//   int get index;
+//           ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Enum' is from 'dart:core'.
+//  - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+//                ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -59,6 +106,51 @@
   no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
     return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
 }
+abstract class EnumInterface extends core::Object implements core::Enum {
+  synthetic constructor •() → self::EnumInterface
+    : super core::Object::•()
+    ;
+}
+class EnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::EnumClass
+    : super self::EnumInterface::•()
+    ;
+  get index() → core::int
+    return 0;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+  synthetic constructor •() → self::AbstractEnumClass
+    : super self::EnumInterface::•()
+    ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+  synthetic constructor •() → self::EnumClass2
+    : super self::AbstractEnumClass::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin extends core::Object implements self::EnumMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+  synthetic constructor •() → self::AbstractEnumClass2
+    : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+    ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+  synthetic constructor •() → self::EnumClass3
+    : super self::AbstractEnumClass2::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
 static method main() → dynamic {}
 
 constants  {
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.expect
index 3c3d062..42fb0ba 100644
--- a/pkg/front_end/testcases/general/hierarchy.dart.weak.expect
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.expect
@@ -2,6 +2,11 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+//       ^
+//
 // pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
 //  - A1.extendedInterfaceMember
 // Try to either
@@ -88,11 +93,6 @@
 //   void mixedInAndImplementedInterfaceMember() {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
-// Try removing one of the occurrences.
-// class A6 extends A1 implements A1 {}
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect
index 3c3d062..42fb0ba 100644
--- a/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect
@@ -2,6 +2,11 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+//       ^
+//
 // pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
 //  - A1.extendedInterfaceMember
 // Try to either
@@ -88,11 +93,6 @@
 //   void mixedInAndImplementedInterfaceMember() {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
-// Try removing one of the occurrences.
-// class A6 extends A1 implements A1 {}
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.outline.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.outline.expect
index 66c5f61..f96deda 100644
--- a/pkg/front_end/testcases/general/hierarchy.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.outline.expect
@@ -2,6 +2,11 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+//       ^
+//
 // pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
 //  - A1.extendedInterfaceMember
 // Try to either
@@ -88,11 +93,6 @@
 //   void mixedInAndImplementedInterfaceMember() {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
-// Try removing one of the occurrences.
-// class A6 extends A1 implements A1 {}
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.transformed.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.transformed.expect
index 2c99461f9..1b21721 100644
--- a/pkg/front_end/testcases/general/hierarchy.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.transformed.expect
@@ -2,6 +2,11 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+//       ^
+//
 // pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
 //  - A1.extendedInterfaceMember
 // Try to either
@@ -88,11 +93,6 @@
 //   void mixedInAndImplementedInterfaceMember() {}
 //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
-// Try removing one of the occurrences.
-// class A6 extends A1 implements A1 {}
-//       ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue48131.dart b/pkg/front_end/testcases/general/issue48131.dart
new file mode 100644
index 0000000..cf58ea6
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class A<X> {
+  void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {
+  new B<Object>().foo<int>();
+}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue48131.dart.textual_outline.expect
new file mode 100644
index 0000000..2e5ec26
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+abstract class A<X> {
+  void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue48131.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..2e5ec26
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+abstract class A<X> {
+  void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.weak.expect b/pkg/front_end/testcases/general/issue48131.dart.weak.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    : super self::A::•()
+    ;
+}
+static method main() → void {
+  new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue48131.dart.weak.modular.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    : super self::A::•()
+    ;
+}
+static method main() → void {
+  new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue48131.dart.weak.outline.expect
new file mode 100644
index 0000000..8eabec2
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.weak.outline.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void
+    ;
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/issue48131.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue48131.dart.weak.transformed.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    : super self::A::•()
+    ;
+}
+static method main() → void {
+  new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart b/pkg/front_end/testcases/nnbd/issue48131.dart
new file mode 100644
index 0000000..cf58ea6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class A<X> {
+  void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {
+  new B<Object>().foo<int>();
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.strong.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    : super self::A::•()
+    ;
+}
+static method main() → void {
+  new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.strong.transformed.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    : super self::A::•()
+    ;
+}
+static method main() → void {
+  new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline.expect
new file mode 100644
index 0000000..2e5ec26
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+abstract class A<X> {
+  void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..2e5ec26
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+abstract class A<X> {
+  void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    : super self::A::•()
+    ;
+}
+static method main() → void {
+  new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.modular.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    : super self::A::•()
+    ;
+}
+static method main() → void {
+  new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.outline.expect
new file mode 100644
index 0000000..8eabec2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.outline.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void
+    ;
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.transformed.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+  synthetic constructor •() → self::B<self::B::Z%>
+    : super self::A::•()
+    ;
+}
+static method main() → void {
+  new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 0685477..98ecdc0 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -168,9 +168,7 @@
 [ $system == windows ]
 cc/CorelibCompilerStats: Skip
 dart/disassemble_determinism_test: Slow, Pass # Times out on slower bots.
-dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579: Dart C API symbols not available.
 dart_2/disassemble_determinism_test: Slow, Pass # Times out on slower bots.
-dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579: Dart C API symbols not available.
 
 [ $arch == ia32 && $mode == debug && $system == windows ]
 dart/transferable_test: Skip # This is performance test and somehow debug win ia32 bot's performance is unpredictable
@@ -275,6 +273,11 @@
 dart_2/null_safety_autodetection_in_kernel_compiler_test: SkipByDesign # Test needs to run from source
 dart_2/snapshot_depfile_test: SkipByDesign # Test needs to run from source
 
+[ $compiler == dartkp && $system == windows ]
+dart/finalizer/weak_reference_run_gc_test: SkipByDesign # https://dartbug.com/40579 Dart C API symbols not available.
+dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579 Dart C API symbols not available.
+dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579 Dart C API symbols not available.
+
 [ $compiler == dartkp && ($arch == simarm || $arch == simarm64 || $arch == simarm64c) ]
 dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test: Pass, Slow
 dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test: Pass, Slow
@@ -317,11 +320,11 @@
 # up with the real Dart stack trace and hence we don't get correct
 # symbol names.
 [ $arch == simarm || $arch == simarm64 || $arch == simarm64c ]
-cc/DartAPI_NativeFieldAccess: Skip # Test uses dart:ffi which is not supported on simulators.
-cc/DartAPI_NativeFieldAccess_Throws: Skip # Test uses dart:ffi which is not supported on simulators.
-cc/Dart_SetFfiNativeResolver: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-cc/Dart_SetFfiNativeResolver_DoesNotResolve: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-cc/Dart_SetFfiNativeResolver_MissingResolver: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
+cc/DartAPI_NativeFieldAccess: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+cc/DartAPI_NativeFieldAccess_Throws: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+cc/Dart_SetFfiNativeResolver: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+cc/Dart_SetFfiNativeResolver_DoesNotResolve: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+cc/Dart_SetFfiNativeResolver_MissingResolver: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
 cc/LargeMap: SkipByDesign
 cc/Profiler_AllocationSampleTest: SkipByDesign
 cc/Profiler_ArrayAllocation: SkipByDesign
@@ -348,20 +351,21 @@
 cc/Profiler_TrivialRecordAllocation: SkipByDesign
 cc/Profiler_TypedArrayAllocation: SkipByDesign
 cc/Service_Profile: SkipByDesign
-dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-dart/isolates/thread_pool_test: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-dart/regress_41971_test: SkipByDesign # dart:ffi is not supported on simulator
+dart/finalizer/weak_reference_run_gc_test: SkipByDesign # https://dartbug.com/37299 FFI not yet supported on simulators.
+dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+dart/isolates/thread_pool_test: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+dart/regress_41971_test: SkipByDesign # https://dartbug.com/37299 dart:ffi is not supported on simulator
 dart/sdk_hash_test: SkipSlow # gen_kernel is slow to run on simarm
-dart/unboxed_param_args_descriptor_test: SkipByDesign # FFI helper not supported on simulator
-dart/unboxed_param_tear_off_test: SkipByDesign # FFI helper not supported on simulator
-dart/unboxed_param_test: SkipByDesign # FFI helper not supported on simulator
-dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-dart_2/isolates/thread_pool_test: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-dart_2/regress_41971_test: SkipByDesign # dart:ffi is not supported on simulator
+dart/unboxed_param_args_descriptor_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart/unboxed_param_tear_off_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart/unboxed_param_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+dart_2/isolates/thread_pool_test: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+dart_2/regress_41971_test: SkipByDesign # https://dartbug.com/37299 dart:ffi is not supported on simulator
 dart_2/sdk_hash_test: SkipSlow # gen_kernel is slow to run on simarm
-dart_2/unboxed_param_args_descriptor_test: SkipByDesign # FFI helper not supported on simulator
-dart_2/unboxed_param_tear_off_test: SkipByDesign # FFI helper not supported on simulator
-dart_2/unboxed_param_test: SkipByDesign # FFI helper not supported on simulator
+dart_2/unboxed_param_args_descriptor_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart_2/unboxed_param_tear_off_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart_2/unboxed_param_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
 
 [ $arch == simarm || $arch == simarm64 || $arch == simarm64c || $system != macos ]
 dart/thread_priority_macos_test: SkipByDesign
diff --git a/sdk/bin/dartanalyzer_sdk b/sdk/bin/dartanalyzer_sdk
index 88f4deb..bb7b84a 100755
--- a/sdk/bin/dartanalyzer_sdk
+++ b/sdk/bin/dartanalyzer_sdk
@@ -6,6 +6,8 @@
 # Run dartanalyzer.dart on the Dart VM. This script assumes the Dart SDK's
 # directory structure.
 
+echo "Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'." 1>&2
+
 function follow_links() {
   file="$1"
   while [ -h "$file" ]; do
diff --git a/sdk/bin/dartanalyzer_sdk.bat b/sdk/bin/dartanalyzer_sdk.bat
index 57dd538..7b1e03b 100644
--- a/sdk/bin/dartanalyzer_sdk.bat
+++ b/sdk/bin/dartanalyzer_sdk.bat
@@ -3,6 +3,8 @@
 REM for details. All rights reserved. Use of this source code is governed by a
 REM BSD-style license that can be found in the LICENSE file.
 
+echo Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'. 1>&2
+
 setlocal
 rem Handle the case where dart-sdk/bin has been symlinked to.
 set DIR_NAME_WITH_SLASH=%~dp0
diff --git a/tools/VERSION b/tools/VERSION
index dd07624..a6ed96c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 36
+PRERELEASE 37
 PRERELEASE_PATCH 0
\ No newline at end of file