Version 2.17.0-32.0.dev

Merge commit 'a03eb19a61dc9a60bb82bf5b23490e7bdab934a3' into 'dev'
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 e47921b..4e4540e 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
@@ -199,14 +199,14 @@
 
     scope.forEach(buildBuilders);
     constructors.forEach(buildBuilders);
-    if (supertypeBuilder != null) {
-      supertypeBuilder = _checkSupertype(supertypeBuilder!);
-    }
     if (isEnumMixin) {
       assert(supertypeBuilder?.name == "_Enum");
       supertypeBuilder?.resolveIn(coreLibrary.scope,
           supertypeBuilder?.charOffset ?? charOffset, fileUri, library);
     }
+    if (supertypeBuilder != null) {
+      supertypeBuilder = _checkSupertype(supertypeBuilder!);
+    }
     Supertype? supertype =
         supertypeBuilder?.buildSupertype(library, charOffset, fileUri);
     if (supertype != null) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index cf5835e..aaf1d48 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -6,30 +6,7 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 
-import 'package:kernel/ast.dart'
-    show
-        Arguments,
-        AsyncMarker,
-        Class,
-        Constructor,
-        ConstructorInvocation,
-        DartType,
-        Expression,
-        Field,
-        InstanceAccessKind,
-        InstanceGet,
-        IntLiteral,
-        ListLiteral,
-        Name,
-        ProcedureKind,
-        Reference,
-        ReturnStatement,
-        StaticGet,
-        StringConcatenation,
-        StringLiteral,
-        SuperInitializer,
-        ThisExpression,
-        setParents;
+import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/reference_from_index.dart' show IndexedClass;
 
@@ -594,12 +571,20 @@
               }
             }
             BodyBuilder? bodyBuilder;
-            if (enumConstantInfo.argumentsBeginToken != null) {
+            if (enumConstantInfo.argumentsBeginToken != null ||
+                typeArgumentBuilders == null && cls.typeParameters.isNotEmpty) {
+              // We need to create a BodyBuilder in two cases: 1) if the
+              // arguments token is provided, we'll use the BodyBuilder to
+              // parse them and perform inference, 2) if the type arguments
+              // aren't provided, but required, we'll use it to infer them.
               bodyBuilder = library.loader
                   .createBodyBuilderForOutlineExpression(
                       library, this, this, scope, fileUri);
               bodyBuilder.constantContext = ConstantContext.required;
-              arguments = bodyBuilder
+            }
+
+            if (enumConstantInfo.argumentsBeginToken != null) {
+              arguments = bodyBuilder!
                   .parseArguments(enumConstantInfo.argumentsBeginToken!);
               bodyBuilder.performBacklogComputations(delayedActionPerformers);
 
@@ -607,11 +592,16 @@
             } else {
               arguments = new ArgumentsImpl(enumSyntheticArguments);
             }
+
             if (typeArguments != null && arguments is ArgumentsImpl) {
               ArgumentsImpl.setNonInferrableArgumentTypes(
                   arguments, typeArguments);
+            } else if (cls.typeParameters.isNotEmpty) {
+              arguments.types.addAll(new List<DartType>.filled(
+                  cls.typeParameters.length, const UnknownType()));
             }
             setParents(enumSyntheticArguments, arguments);
+
             Expression initializer = new ConstructorInvocation(
                 constructorBuilder.constructor, arguments,
                 isConst: true)
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 54f7ba1..4e51302 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -491,6 +491,8 @@
 getter1c
 getter1d
 getter1e
+gi
+gm
 goo
 google
 graphic
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart
index 6afc407..1197e8e 100644
--- a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart
@@ -16,4 +16,8 @@
   const E2(X f);
 }
 
+enum E3<X extends num, Y extends String, Z extends Function(X, Y)> {
+  element
+}
+
 main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect
index cdcb164..494cf2f 100644
--- a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.expect
@@ -20,6 +20,15 @@
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
 }
+class E3<X extends core::num, Y extends core::String, Z extends (self::E3::X, self::E3::Y) → dynamic = (Never, Never) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<core::num, core::String, (Never, Never) → dynamic>> values = #C9;
+  static const field self::E3<core::num, core::String, (core::num, core::String) → dynamic> element = #C8;
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::X, self::E3::Y, self::E3::Z>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
 static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
   return x;
 static method main() → dynamic {}
@@ -31,6 +40,9 @@
   #C4 = <self::E1>[#C3]
   #C5 = self::E2<<X extends core::Object? = dynamic>(X%) → X%> {index:#C1, _name:#C2}
   #C6 = <self::E2<dynamic>>[#C5]
+  #C7 = "element"
+  #C8 = self::E3<core::num, core::String, (core::num, core::String) → dynamic> {index:#C1, _name:#C7}
+  #C9 = <self::E3<dynamic, dynamic, dynamic>>[#C8]
 }
 
 
@@ -40,3 +52,4 @@
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
 - E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
+- E3. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:19:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect
index cdcb164..494cf2f 100644
--- a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.strong.transformed.expect
@@ -20,6 +20,15 @@
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
 }
+class E3<X extends core::num, Y extends core::String, Z extends (self::E3::X, self::E3::Y) → dynamic = (Never, Never) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<core::num, core::String, (Never, Never) → dynamic>> values = #C9;
+  static const field self::E3<core::num, core::String, (core::num, core::String) → dynamic> element = #C8;
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::X, self::E3::Y, self::E3::Z>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
 static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
   return x;
 static method main() → dynamic {}
@@ -31,6 +40,9 @@
   #C4 = <self::E1>[#C3]
   #C5 = self::E2<<X extends core::Object? = dynamic>(X%) → X%> {index:#C1, _name:#C2}
   #C6 = <self::E2<dynamic>>[#C5]
+  #C7 = "element"
+  #C8 = self::E3<core::num, core::String, (core::num, core::String) → dynamic> {index:#C1, _name:#C7}
+  #C9 = <self::E3<dynamic, dynamic, dynamic>>[#C8]
 }
 
 
@@ -40,3 +52,4 @@
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
 - E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
+- E3. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:19:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect
index 9f80f5b..707dc9c 100644
--- a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.textual_outline.expect
@@ -1,4 +1,5 @@
 X foo<X>(X x) => x;
 enum E1 { bar(foo); const E1(int Function(int) f); }
 enum E2<X> { bar(foo); const E2(X f); }
+enum E3<X extends num, Y extends String, Z extends Function(X, Y)> { element }
 main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect
index a6f1734..ae69448 100644
--- a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.expect
@@ -20,6 +20,15 @@
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
 }
+class E3<X extends core::num, Y extends core::String, Z extends (self::E3::X, self::E3::Y) → dynamic = (Never, Never) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<core::num, core::String, (Never, Never) → dynamic>> values = #C9;
+  static const field self::E3<core::num, core::String, (core::num, core::String) → dynamic> element = #C8;
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::X, self::E3::Y, self::E3::Z>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
 static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
   return x;
 static method main() → dynamic {}
@@ -31,6 +40,9 @@
   #C4 = <self::E1*>[#C3]
   #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
   #C6 = <self::E2<dynamic>*>[#C5]
+  #C7 = "element"
+  #C8 = self::E3<core::num*, core::String*, (core::num*, core::String*) →* dynamic> {index:#C1, _name:#C7}
+  #C9 = <self::E3<dynamic, dynamic, dynamic>*>[#C8]
 }
 
 
@@ -40,3 +52,4 @@
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
 - E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
+- E3. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:19:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect
index a6f1734..ae69448 100644
--- a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.modular.expect
@@ -20,6 +20,15 @@
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
 }
+class E3<X extends core::num, Y extends core::String, Z extends (self::E3::X, self::E3::Y) → dynamic = (Never, Never) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<core::num, core::String, (Never, Never) → dynamic>> values = #C9;
+  static const field self::E3<core::num, core::String, (core::num, core::String) → dynamic> element = #C8;
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::X, self::E3::Y, self::E3::Z>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
 static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
   return x;
 static method main() → dynamic {}
@@ -31,6 +40,9 @@
   #C4 = <self::E1*>[#C3]
   #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
   #C6 = <self::E2<dynamic>*>[#C5]
+  #C7 = "element"
+  #C8 = self::E3<core::num*, core::String*, (core::num*, core::String*) →* dynamic> {index:#C1, _name:#C7}
+  #C9 = <self::E3<dynamic, dynamic, dynamic>*>[#C8]
 }
 
 
@@ -40,3 +52,4 @@
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
 - E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
+- E3. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:19:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect
index 2a59034..399e220 100644
--- a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.outline.expect
@@ -20,6 +20,15 @@
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
 }
+class E3<X extends core::num, Y extends core::String, Z extends (self::E3::X, self::E3::Y) → dynamic = (Never, Never) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<core::num, core::String, (Never, Never) → dynamic>> values = const <self::E3<dynamic, dynamic, dynamic>>[self::E3::element];
+  static const field self::E3<core::num, core::String, (core::num, core::String) → dynamic> element = const self::E3::•<core::num, core::String, (core::num, core::String) → dynamic>(0, "element");
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::X, self::E3::Y, self::E3::Z>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
 static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
   ;
 static method main() → dynamic
@@ -31,4 +40,6 @@
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:8:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "bar"})
 Evaluated: ListLiteral @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:13:6 -> ListConstant(const <E2<dynamic>*>[const E2<X* Function<X>(X*)*>{_Enum.index: 0, _Enum._name: "bar"}])
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:14:3 -> InstanceConstant(const E2<X* Function<X>(X*)*>{_Enum.index: 0, _Enum._name: "bar"})
-Extra constant evaluation: evaluated: 14, effectively constant: 4
+Evaluated: ListLiteral @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:19:6 -> ListConstant(const <E3<dynamic, dynamic, dynamic>*>[const E3<num*, String*, dynamic Function(num*, String*)*>{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///inference_in_constructor_parameters.dart:20:3 -> InstanceConstant(const E3<num*, String*, dynamic Function(num*, String*)*>{_Enum.index: 0, _Enum._name: "element"})
+Extra constant evaluation: evaluated: 21, effectively constant: 6
diff --git a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect
index a6f1734..ae69448 100644
--- a/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/inference_in_constructor_parameters.dart.weak.transformed.expect
@@ -20,6 +20,15 @@
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
 }
+class E3<X extends core::num, Y extends core::String, Z extends (self::E3::X, self::E3::Y) → dynamic = (Never, Never) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<core::num, core::String, (Never, Never) → dynamic>> values = #C9;
+  static const field self::E3<core::num, core::String, (core::num, core::String) → dynamic> element = #C8;
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::X, self::E3::Y, self::E3::Z>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
 static method foo<X extends core::Object? = dynamic>(self::foo::X% x) → self::foo::X%
   return x;
 static method main() → dynamic {}
@@ -31,6 +40,9 @@
   #C4 = <self::E1*>[#C3]
   #C5 = self::E2<<X extends core::Object? = dynamic>(X*) →* X*> {index:#C1, _name:#C2}
   #C6 = <self::E2<dynamic>*>[#C5]
+  #C7 = "element"
+  #C8 = self::E3<core::num*, core::String*, (core::num*, core::String*) →* dynamic> {index:#C1, _name:#C7}
+  #C9 = <self::E3<dynamic, dynamic, dynamic>*>[#C8]
 }
 
 
@@ -40,3 +52,4 @@
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
 - E2. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:16:9)
+- E3. (from org-dartlang-testcase:///inference_in_constructor_parameters.dart:19:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart
new file mode 100644
index 0000000..1e4851f
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// The test checks an execution path where _Enum as supertype was checked before
+// being resolved.
+
+mixin GM<T> on Enum {}
+
+mixin M on Object {}
+
+abstract class I {}
+
+abstract class GI<T> {}
+
+enum E<S extends num, T extends num>
+    with GM<T>, M
+    implements I, GI<S> { element }
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.expect
new file mode 100644
index 0000000..2a27047
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class GM<T extends core::Object? = dynamic> extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+}
+abstract class GI<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GI<self::GI::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class _E&_Enum&GM<S extends core::num, T extends core::num> = core::_Enum with self::GM<self::_E&_Enum&GM::T> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM<self::_E&_Enum&GM::S, self::_E&_Enum&GM::T>
+    : super core::_Enum::•(index, _name)
+    ;
+}
+abstract class _E&_Enum&GM&M<S extends core::num, T extends core::num> = self::_E&_Enum&GM<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T> with self::M /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM&M<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T>
+    : super self::_E&_Enum&GM::•(index, _name)
+    ;
+}
+class E<S extends core::num, T extends core::num> extends self::_E&_Enum&GM&M<self::E::S, self::E::T> implements self::I, self::GI<self::E::S> /*isEnum*/  {
+  static const field core::List<self::E<core::num, core::num>> values = #C4;
+  static const field self::E<core::num, core::num> element = #C3;
+  const constructor •(core::int index, core::String name) → self::E<self::E::S, self::E::T>
+    : super self::_E&_Enum&GM&M::•(index, name)
+    ;
+  method toString() → core::String
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E<core::num, core::num> {index:#C1, _name:#C2}
+  #C4 = <self::E<dynamic, dynamic>>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///supertype_resolved_before_checking.dart:
+- E. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM&M. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.transformed.expect
new file mode 100644
index 0000000..f14e87d
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.strong.transformed.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class GM<T extends core::Object? = dynamic> extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+}
+abstract class GI<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GI<self::GI::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class _E&_Enum&GM<S extends core::num, T extends core::num> extends core::_Enum implements self::GM<self::_E&_Enum&GM::T> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM<self::_E&_Enum&GM::S, self::_E&_Enum&GM::T>
+    : super core::_Enum::•(index, _name)
+    ;
+}
+abstract class _E&_Enum&GM&M<S extends core::num, T extends core::num> extends self::_E&_Enum&GM<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T> implements self::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM&M<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T>
+    : super self::_E&_Enum&GM::•(index, _name)
+    ;
+}
+class E<S extends core::num, T extends core::num> extends self::_E&_Enum&GM&M<self::E::S, self::E::T> implements self::I, self::GI<self::E::S> /*isEnum*/  {
+  static const field core::List<self::E<core::num, core::num>> values = #C4;
+  static const field self::E<core::num, core::num> element = #C3;
+  const constructor •(core::int index, core::String name) → self::E<self::E::S, self::E::T>
+    : super self::_E&_Enum&GM&M::•(index, name)
+    ;
+  method toString() → core::String
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E<core::num, core::num> {index:#C1, _name:#C2}
+  #C4 = <self::E<dynamic, dynamic>>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///supertype_resolved_before_checking.dart:
+- E. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM&M. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.textual_outline.expect
new file mode 100644
index 0000000..5874d3e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+mixin GM<T> on Enum {}
+mixin M on Object {}
+abstract class I {}
+abstract class GI<T> {}
+enum E<S extends num, T extends num> with GM<T>, M implements I, GI<S> { element }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.expect
new file mode 100644
index 0000000..93e970e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class GM<T extends core::Object? = dynamic> extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+}
+abstract class GI<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GI<self::GI::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class _E&_Enum&GM<S extends core::num, T extends core::num> = core::_Enum with self::GM<self::_E&_Enum&GM::T> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM<self::_E&_Enum&GM::S, self::_E&_Enum&GM::T>
+    : super core::_Enum::•(index, _name)
+    ;
+}
+abstract class _E&_Enum&GM&M<S extends core::num, T extends core::num> = self::_E&_Enum&GM<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T> with self::M /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM&M<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T>
+    : super self::_E&_Enum&GM::•(index, _name)
+    ;
+}
+class E<S extends core::num, T extends core::num> extends self::_E&_Enum&GM&M<self::E::S, self::E::T> implements self::I, self::GI<self::E::S> /*isEnum*/  {
+  static const field core::List<self::E<core::num, core::num>> values = #C4;
+  static const field self::E<core::num, core::num> element = #C3;
+  const constructor •(core::int index, core::String name) → self::E<self::E::S, self::E::T>
+    : super self::_E&_Enum&GM&M::•(index, name)
+    ;
+  method toString() → core::String
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E<core::num*, core::num*> {index:#C1, _name:#C2}
+  #C4 = <self::E<dynamic, dynamic>*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///supertype_resolved_before_checking.dart:
+- E. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM&M. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.modular.expect
new file mode 100644
index 0000000..93e970e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class GM<T extends core::Object? = dynamic> extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+}
+abstract class GI<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GI<self::GI::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class _E&_Enum&GM<S extends core::num, T extends core::num> = core::_Enum with self::GM<self::_E&_Enum&GM::T> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM<self::_E&_Enum&GM::S, self::_E&_Enum&GM::T>
+    : super core::_Enum::•(index, _name)
+    ;
+}
+abstract class _E&_Enum&GM&M<S extends core::num, T extends core::num> = self::_E&_Enum&GM<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T> with self::M /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM&M<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T>
+    : super self::_E&_Enum&GM::•(index, _name)
+    ;
+}
+class E<S extends core::num, T extends core::num> extends self::_E&_Enum&GM&M<self::E::S, self::E::T> implements self::I, self::GI<self::E::S> /*isEnum*/  {
+  static const field core::List<self::E<core::num, core::num>> values = #C4;
+  static const field self::E<core::num, core::num> element = #C3;
+  const constructor •(core::int index, core::String name) → self::E<self::E::S, self::E::T>
+    : super self::_E&_Enum&GM&M::•(index, name)
+    ;
+  method toString() → core::String
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E<core::num*, core::num*> {index:#C1, _name:#C2}
+  #C4 = <self::E<dynamic, dynamic>*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///supertype_resolved_before_checking.dart:
+- E. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM&M. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.outline.expect
new file mode 100644
index 0000000..7647f76
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.outline.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class GM<T extends core::Object? = dynamic> extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    ;
+}
+abstract class GI<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GI<self::GI::T%>
+    ;
+}
+abstract class _E&_Enum&GM<S extends core::num, T extends core::num> = core::_Enum with self::GM<self::_E&_Enum&GM::T> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM<self::_E&_Enum&GM::S, self::_E&_Enum&GM::T>
+    : super core::_Enum::•(index, _name)
+    ;
+}
+abstract class _E&_Enum&GM&M<S extends core::num, T extends core::num> = self::_E&_Enum&GM<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T> with self::M /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM&M<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T>
+    : super self::_E&_Enum&GM::•(index, _name)
+    ;
+}
+class E<S extends core::num, T extends core::num> extends self::_E&_Enum&GM&M<self::E::S, self::E::T> implements self::I, self::GI<self::E::S> /*isEnum*/  {
+  static const field core::List<self::E<core::num, core::num>> values = const <self::E<dynamic, dynamic>>[self::E::element];
+  static const field self::E<core::num, core::num> element = const self::E::•<core::num, core::num>(0, "element");
+  const constructor •(core::int index, core::String name) → self::E<self::E::S, self::E::T>
+    ;
+  method toString() → core::String
+    ;
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6 -> ListConstant(const <E<dynamic, dynamic>*>[const E<num*, num*>{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///supertype_resolved_before_checking.dart:18:27 -> InstanceConstant(const E<num*, num*>{})
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.transformed.expect
new file mode 100644
index 0000000..af64aef
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/supertype_resolved_before_checking.dart.weak.transformed.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class GM<T extends core::Object? = dynamic> extends core::Enum /*isMixinDeclaration*/  {
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+}
+abstract class GI<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GI<self::GI::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class _E&_Enum&GM<S extends core::num, T extends core::num> extends core::_Enum implements self::GM<self::_E&_Enum&GM::T> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM<self::_E&_Enum&GM::S, self::_E&_Enum&GM::T>
+    : super core::_Enum::•(index, _name)
+    ;
+}
+abstract class _E&_Enum&GM&M<S extends core::num, T extends core::num> extends self::_E&_Enum&GM<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T> implements self::M /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&GM&M<self::_E&_Enum&GM&M::S, self::_E&_Enum&GM&M::T>
+    : super self::_E&_Enum&GM::•(index, _name)
+    ;
+}
+class E<S extends core::num, T extends core::num> extends self::_E&_Enum&GM&M<self::E::S, self::E::T> implements self::I, self::GI<self::E::S> /*isEnum*/  {
+  static const field core::List<self::E<core::num, core::num>> values = #C4;
+  static const field self::E<core::num, core::num> element = #C3;
+  const constructor •(core::int index, core::String name) → self::E<self::E::S, self::E::T>
+    : super self::_E&_Enum&GM&M::•(index, name)
+    ;
+  method toString() → core::String
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E<core::num*, core::num*> {index:#C1, _name:#C2}
+  #C4 = <self::E<dynamic, dynamic>*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///supertype_resolved_before_checking.dart:
+- E. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM&M. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _E&_Enum&GM. (from org-dartlang-testcase:///supertype_resolved_before_checking.dart:16:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 1995742..d95e1b6 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -40,6 +40,7 @@
 enhanced_enums/simple_fields: FormatterCrash
 enhanced_enums/simple_interfaces: FormatterCrash
 enhanced_enums/simple_mixins: FormatterCrash
+enhanced_enums/supertype_resolved_before_checking: FormatterCrash
 extension_types/basic_show: FormatterCrash
 extension_types/call_not_get: FormatterCrash
 extension_types/keyword_in_show_hide_element: FormatterCrash
diff --git a/tools/VERSION b/tools/VERSION
index b85d527..36036a4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 31
+PRERELEASE 32
 PRERELEASE_PATCH 0
\ No newline at end of file