[cfe] Support type arguments on enum types

Part of https://github.com/dart-lang/sdk/issues/47453

Closes https://github.com/dart-lang/sdk/issues/48141

Change-Id: Ibfda7546ba0da91dbd0430f55b878af58a1bb99c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/228202
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
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 c9f1615..d79e266 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
@@ -19,7 +19,6 @@
         InstanceAccessKind,
         InstanceGet,
         IntLiteral,
-        InterfaceType,
         ListLiteral,
         Name,
         ProcedureKind,
@@ -450,12 +449,6 @@
   TypeBuilder? get mixedInTypeBuilder => null;
 
   @override
-  InterfaceType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
-    return rawType(nullabilityBuilder.build(library));
-  }
-
-  @override
   Class build(SourceLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary) {
     cls.isEnum = true;
     intType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 3c9845d..dba09e0 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -325,6 +325,7 @@
 ec
 echo
 edits
+ei
 einst
 elapse
 elegantly
diff --git a/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart
new file mode 100644
index 0000000..971776f
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart
@@ -0,0 +1,58 @@
+// 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.
+
+enum E<X> {
+  one(1),
+  two("2");
+
+  final X field;
+
+  const E(this.field);
+}
+
+test() {
+  foo(E.one, E.two); // Ok.
+}
+
+foo(E<int> ei, E<String> es) {
+  bar(ei, es); // Ok.
+  bar(E.one, E.two); // Ok.
+  bar(es, ei); // Error.
+  bar(E.two, E.one); // Error.
+}
+
+bar(E<int> ei, E<String> es) {
+  baz(ei, es); // Ok.
+}
+
+baz(E<Object> ei, E<Object> es) {
+  boz(ei, es); // Error.
+  boz(E.one, E.two); // Error.
+}
+
+boz(E<Never> ei, E<Never> es) {}
+
+checkIsType<T>(x) {
+  if (x is! T) {
+    throw "Expected value of type ${x.runtimeType} to also be of type ${T}.";
+  }
+}
+
+checkIsNotType<T>(x) {
+  if (x is T) {
+    throw "Expected value of type ${x.runtimeType} to not be of type ${T}.";
+  }
+}
+
+main() {
+  checkIsType<E<dynamic>>(E.one);
+  checkIsType<E<dynamic>>(E.two);
+  checkIsType<E<int>>(E.one);
+  checkIsType<E<String>>(E.two);
+
+  checkIsNotType<E<Never>>(E.one);
+  checkIsNotType<E<Never>>(E.two);
+  checkIsNotType<E<String>>(E.one);
+  checkIsNotType<E<int>>(E.two);
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.strong.expect
new file mode 100644
index 0000000..7e8bae6
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.strong.expect
@@ -0,0 +1,141 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//                ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic>> values = #C8;
+  static const field self::E<core::int> one = #C4;
+  static const field self::E<core::String> two = #C7;
+  final field self::E::X% field;
+  const constructor •(core::int index, core::String name, self::E::X% field) → self::E<self::E::X%>
+    : self::E::field = field, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method test() → dynamic {
+  self::foo(#C4, #C7);
+}
+static method foo(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::bar(ei, es);
+  self::bar(#C4, #C7);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+      ^" in es as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+          ^" in ei as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+        ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+               ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+}
+static method bar(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::baz(ei, es);
+}
+static method baz(self::E<core::Object> ei, self::E<core::Object> es) → dynamic {
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+      ^" in ei as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+          ^" in es as{TypeError,ForNonNullableByDefault} self::E<Never>);
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+        ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+               ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<Never>);
+}
+static method boz(self::E<Never> ei, self::E<Never> es) → dynamic {}
+static method checkIsType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(!(x is{ForNonNullableByDefault} self::checkIsType::T%)) {
+    throw "Expected value of type ${x.{core::Object::runtimeType}{core::Type}} to also be of type ${self::checkIsType::T%}.";
+  }
+}
+static method checkIsNotType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(x is{ForNonNullableByDefault} self::checkIsNotType::T%) {
+    throw "Expected value of type ${x{self::checkIsNotType::T%}.{core::Object::runtimeType}{core::Type}} to not be of type ${self::checkIsNotType::T%}.";
+  }
+}
+static method main() → dynamic {
+  self::checkIsType<self::E<dynamic>>(#C4);
+  self::checkIsType<self::E<dynamic>>(#C7);
+  self::checkIsType<self::E<core::int>>(#C4);
+  self::checkIsType<self::E<core::String>>(#C7);
+  self::checkIsNotType<self::E<Never>>(#C4);
+  self::checkIsNotType<self::E<Never>>(#C7);
+  self::checkIsNotType<self::E<core::String>>(#C4);
+  self::checkIsNotType<self::E<core::int>>(#C7);
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E<core::int> {field:#C1, index:#C2, _name:#C3}
+  #C5 = "2"
+  #C6 = "two"
+  #C7 = self::E<core::String> {field:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E<dynamic>>[#C4, #C7]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///instantiated_generic_enum_types.dart:
+- E. (from org-dartlang-testcase:///instantiated_generic_enum_types.dart:11:9)
+- _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/instantiated_generic_enum_types.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.strong.transformed.expect
new file mode 100644
index 0000000..7e8bae6
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.strong.transformed.expect
@@ -0,0 +1,141 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//                ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic>> values = #C8;
+  static const field self::E<core::int> one = #C4;
+  static const field self::E<core::String> two = #C7;
+  final field self::E::X% field;
+  const constructor •(core::int index, core::String name, self::E::X% field) → self::E<self::E::X%>
+    : self::E::field = field, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method test() → dynamic {
+  self::foo(#C4, #C7);
+}
+static method foo(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::bar(ei, es);
+  self::bar(#C4, #C7);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+      ^" in es as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+          ^" in ei as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+        ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+               ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+}
+static method bar(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::baz(ei, es);
+}
+static method baz(self::E<core::Object> ei, self::E<core::Object> es) → dynamic {
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+      ^" in ei as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+          ^" in es as{TypeError,ForNonNullableByDefault} self::E<Never>);
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+        ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+               ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<Never>);
+}
+static method boz(self::E<Never> ei, self::E<Never> es) → dynamic {}
+static method checkIsType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(!(x is{ForNonNullableByDefault} self::checkIsType::T%)) {
+    throw "Expected value of type ${x.{core::Object::runtimeType}{core::Type}} to also be of type ${self::checkIsType::T%}.";
+  }
+}
+static method checkIsNotType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(x is{ForNonNullableByDefault} self::checkIsNotType::T%) {
+    throw "Expected value of type ${x{self::checkIsNotType::T%}.{core::Object::runtimeType}{core::Type}} to not be of type ${self::checkIsNotType::T%}.";
+  }
+}
+static method main() → dynamic {
+  self::checkIsType<self::E<dynamic>>(#C4);
+  self::checkIsType<self::E<dynamic>>(#C7);
+  self::checkIsType<self::E<core::int>>(#C4);
+  self::checkIsType<self::E<core::String>>(#C7);
+  self::checkIsNotType<self::E<Never>>(#C4);
+  self::checkIsNotType<self::E<Never>>(#C7);
+  self::checkIsNotType<self::E<core::String>>(#C4);
+  self::checkIsNotType<self::E<core::int>>(#C7);
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E<core::int> {field:#C1, index:#C2, _name:#C3}
+  #C5 = "2"
+  #C6 = "two"
+  #C7 = self::E<core::String> {field:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E<dynamic>>[#C4, #C7]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///instantiated_generic_enum_types.dart:
+- E. (from org-dartlang-testcase:///instantiated_generic_enum_types.dart:11:9)
+- _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/instantiated_generic_enum_types.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.textual_outline.expect
new file mode 100644
index 0000000..8ce4f0c
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+enum E<X> { one(1), two("2"); final X field; const E(this.field); }
+test() {}
+foo(E<int> ei, E<String> es) {}
+bar(E<int> ei, E<String> es) {}
+baz(E<Object> ei, E<Object> es) {}
+boz(E<Never> ei, E<Never> es) {}
+checkIsType<T>(x) {}
+checkIsNotType<T>(x) {}
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.expect
new file mode 100644
index 0000000..fb83333
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.expect
@@ -0,0 +1,141 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//                ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic>> values = #C8;
+  static const field self::E<core::int> one = #C4;
+  static const field self::E<core::String> two = #C7;
+  final field self::E::X% field;
+  const constructor •(core::int index, core::String name, self::E::X% field) → self::E<self::E::X%>
+    : self::E::field = field, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method test() → dynamic {
+  self::foo(#C4, #C7);
+}
+static method foo(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::bar(ei, es);
+  self::bar(#C4, #C7);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+      ^" in es as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+          ^" in ei as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+        ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+               ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+}
+static method bar(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::baz(ei, es);
+}
+static method baz(self::E<core::Object> ei, self::E<core::Object> es) → dynamic {
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+      ^" in ei as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+          ^" in es as{TypeError,ForNonNullableByDefault} self::E<Never>);
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+        ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+               ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<Never>);
+}
+static method boz(self::E<Never> ei, self::E<Never> es) → dynamic {}
+static method checkIsType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(!(x is{ForNonNullableByDefault} self::checkIsType::T%)) {
+    throw "Expected value of type ${x.{core::Object::runtimeType}{core::Type}} to also be of type ${self::checkIsType::T%}.";
+  }
+}
+static method checkIsNotType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(x is{ForNonNullableByDefault} self::checkIsNotType::T%) {
+    throw "Expected value of type ${x{self::checkIsNotType::T%}.{core::Object::runtimeType}{core::Type}} to not be of type ${self::checkIsNotType::T%}.";
+  }
+}
+static method main() → dynamic {
+  self::checkIsType<self::E<dynamic>>(#C4);
+  self::checkIsType<self::E<dynamic>>(#C7);
+  self::checkIsType<self::E<core::int>>(#C4);
+  self::checkIsType<self::E<core::String>>(#C7);
+  self::checkIsNotType<self::E<Never>>(#C4);
+  self::checkIsNotType<self::E<Never>>(#C7);
+  self::checkIsNotType<self::E<core::String>>(#C4);
+  self::checkIsNotType<self::E<core::int>>(#C7);
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E<core::int*> {field:#C1, index:#C2, _name:#C3}
+  #C5 = "2"
+  #C6 = "two"
+  #C7 = self::E<core::String*> {field:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E<dynamic>*>[#C4, #C7]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///instantiated_generic_enum_types.dart:
+- E. (from org-dartlang-testcase:///instantiated_generic_enum_types.dart:11:9)
+- _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/instantiated_generic_enum_types.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.modular.expect
new file mode 100644
index 0000000..fb83333
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.modular.expect
@@ -0,0 +1,141 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//                ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic>> values = #C8;
+  static const field self::E<core::int> one = #C4;
+  static const field self::E<core::String> two = #C7;
+  final field self::E::X% field;
+  const constructor •(core::int index, core::String name, self::E::X% field) → self::E<self::E::X%>
+    : self::E::field = field, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method test() → dynamic {
+  self::foo(#C4, #C7);
+}
+static method foo(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::bar(ei, es);
+  self::bar(#C4, #C7);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+      ^" in es as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+          ^" in ei as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+        ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+               ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+}
+static method bar(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::baz(ei, es);
+}
+static method baz(self::E<core::Object> ei, self::E<core::Object> es) → dynamic {
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+      ^" in ei as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+          ^" in es as{TypeError,ForNonNullableByDefault} self::E<Never>);
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+        ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+               ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<Never>);
+}
+static method boz(self::E<Never> ei, self::E<Never> es) → dynamic {}
+static method checkIsType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(!(x is{ForNonNullableByDefault} self::checkIsType::T%)) {
+    throw "Expected value of type ${x.{core::Object::runtimeType}{core::Type}} to also be of type ${self::checkIsType::T%}.";
+  }
+}
+static method checkIsNotType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(x is{ForNonNullableByDefault} self::checkIsNotType::T%) {
+    throw "Expected value of type ${x{self::checkIsNotType::T%}.{core::Object::runtimeType}{core::Type}} to not be of type ${self::checkIsNotType::T%}.";
+  }
+}
+static method main() → dynamic {
+  self::checkIsType<self::E<dynamic>>(#C4);
+  self::checkIsType<self::E<dynamic>>(#C7);
+  self::checkIsType<self::E<core::int>>(#C4);
+  self::checkIsType<self::E<core::String>>(#C7);
+  self::checkIsNotType<self::E<Never>>(#C4);
+  self::checkIsNotType<self::E<Never>>(#C7);
+  self::checkIsNotType<self::E<core::String>>(#C4);
+  self::checkIsNotType<self::E<core::int>>(#C7);
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E<core::int*> {field:#C1, index:#C2, _name:#C3}
+  #C5 = "2"
+  #C6 = "two"
+  #C7 = self::E<core::String*> {field:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E<dynamic>*>[#C4, #C7]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///instantiated_generic_enum_types.dart:
+- E. (from org-dartlang-testcase:///instantiated_generic_enum_types.dart:11:9)
+- _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/instantiated_generic_enum_types.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.outline.expect
new file mode 100644
index 0000000..0f67ffa
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.outline.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic>> values = const <self::E<dynamic>>[self::E::one, self::E::two];
+  static const field self::E<core::int> one = const self::E::•<core::int>(0, "one", 1);
+  static const field self::E<core::String> two = const self::E::•<core::String>(1, "two", "2");
+  final field self::E::X% field;
+  const constructor •(core::int index, core::String name, self::E::X% field) → self::E<self::E::X%>
+    : self::E::field = field, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method test() → dynamic
+  ;
+static method foo(self::E<core::int> ei, self::E<core::String> es) → dynamic
+  ;
+static method bar(self::E<core::int> ei, self::E<core::String> es) → dynamic
+  ;
+static method baz(self::E<core::Object> ei, self::E<core::Object> es) → dynamic
+  ;
+static method boz(self::E<Never> ei, self::E<Never> es) → dynamic
+  ;
+static method checkIsType<T extends core::Object? = dynamic>(dynamic x) → dynamic
+  ;
+static method checkIsNotType<T extends core::Object? = dynamic>(dynamic x) → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///instantiated_generic_enum_types.dart:5:6 -> ListConstant(const <E<dynamic>*>[const E<int*>{E.field: 1, _Enum.index: 0, _Enum._name: "one"}, const E<String*>{E.field: "2", _Enum.index: 1, _Enum._name: "two"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///instantiated_generic_enum_types.dart:6:3 -> InstanceConstant(const E<int*>{E.field: 1, _Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///instantiated_generic_enum_types.dart:7:3 -> InstanceConstant(const E<String*>{E.field: "2", _Enum.index: 1, _Enum._name: "two"})
+Extra constant evaluation: evaluated: 9, effectively constant: 3
diff --git a/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.transformed.expect
new file mode 100644
index 0000000..fb83333
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart.weak.transformed.expect
@@ -0,0 +1,141 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(es, ei); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   bar(E.two, E.one); // Error.
+//                ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//  - 'Object' is from 'dart:core'.
+//   boz(ei, es); // Error.
+//           ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+//   boz(E.one, E.two); // Error.
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E<dynamic>> values = #C8;
+  static const field self::E<core::int> one = #C4;
+  static const field self::E<core::String> two = #C7;
+  final field self::E::X% field;
+  const constructor •(core::int index, core::String name, self::E::X% field) → self::E<self::E::X%>
+    : self::E::field = field, super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method test() → dynamic {
+  self::foo(#C4, #C7);
+}
+static method foo(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::bar(ei, es);
+  self::bar(#C4, #C7);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:7: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+      ^" in es as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:21:11: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(es, ei); // Error.
+          ^" in ei as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:9: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<int>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+        ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<core::int>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:22:16: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<String>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  bar(E.two, E.one); // Error.
+               ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<core::String>);
+}
+static method bar(self::E<core::int> ei, self::E<core::String> es) → dynamic {
+  self::baz(ei, es);
+}
+static method baz(self::E<core::Object> ei, self::E<core::Object> es) → dynamic {
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:7: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+      ^" in ei as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:30:11: Error: The argument type 'E<Object>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+ - 'Object' is from 'dart:core'.
+  boz(ei, es); // Error.
+          ^" in es as{TypeError,ForNonNullableByDefault} self::E<Never>);
+  self::boz(invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:9: Error: The argument type 'E<int>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+        ^" in #C4 as{TypeError,ForNonNullableByDefault} self::E<Never>, invalid-expression "pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart:31:16: Error: The argument type 'E<String>' can't be assigned to the parameter type 'E<Never>'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/instantiated_generic_enum_types.dart'.
+  boz(E.one, E.two); // Error.
+               ^" in #C7 as{TypeError,ForNonNullableByDefault} self::E<Never>);
+}
+static method boz(self::E<Never> ei, self::E<Never> es) → dynamic {}
+static method checkIsType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(!(x is{ForNonNullableByDefault} self::checkIsType::T%)) {
+    throw "Expected value of type ${x.{core::Object::runtimeType}{core::Type}} to also be of type ${self::checkIsType::T%}.";
+  }
+}
+static method checkIsNotType<T extends core::Object? = dynamic>(dynamic x) → dynamic {
+  if(x is{ForNonNullableByDefault} self::checkIsNotType::T%) {
+    throw "Expected value of type ${x{self::checkIsNotType::T%}.{core::Object::runtimeType}{core::Type}} to not be of type ${self::checkIsNotType::T%}.";
+  }
+}
+static method main() → dynamic {
+  self::checkIsType<self::E<dynamic>>(#C4);
+  self::checkIsType<self::E<dynamic>>(#C7);
+  self::checkIsType<self::E<core::int>>(#C4);
+  self::checkIsType<self::E<core::String>>(#C7);
+  self::checkIsNotType<self::E<Never>>(#C4);
+  self::checkIsNotType<self::E<Never>>(#C7);
+  self::checkIsNotType<self::E<core::String>>(#C4);
+  self::checkIsNotType<self::E<core::int>>(#C7);
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = "one"
+  #C4 = self::E<core::int*> {field:#C1, index:#C2, _name:#C3}
+  #C5 = "2"
+  #C6 = "two"
+  #C7 = self::E<core::String*> {field:#C5, index:#C1, _name:#C6}
+  #C8 = <self::E<dynamic>*>[#C4, #C7]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///instantiated_generic_enum_types.dart:
+- E. (from org-dartlang-testcase:///instantiated_generic_enum_types.dart:11:9)
+- _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/members.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/members.dart.strong.expect
index d81899d..c358d70 100644
--- a/pkg/front_end/testcases/enhanced_enums/members.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/members.dart.strong.expect
@@ -33,7 +33,7 @@
     ;
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
-  static factory f<X extends core::Object? = dynamic>() → self::E2<dynamic>
+  static factory f<X extends core::Object? = dynamic>() → self::E2<self::E2::f::X%>
     return throw 42;
   method method(core::int value) → core::int
     return value.{core::num::+}(10){(core::num) → core::int};
diff --git a/pkg/front_end/testcases/enhanced_enums/members.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/members.dart.strong.transformed.expect
index d81899d..c358d70 100644
--- a/pkg/front_end/testcases/enhanced_enums/members.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/members.dart.strong.transformed.expect
@@ -33,7 +33,7 @@
     ;
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
-  static factory f<X extends core::Object? = dynamic>() → self::E2<dynamic>
+  static factory f<X extends core::Object? = dynamic>() → self::E2<self::E2::f::X%>
     return throw 42;
   method method(core::int value) → core::int
     return value.{core::num::+}(10){(core::num) → core::int};
diff --git a/pkg/front_end/testcases/enhanced_enums/members.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/members.dart.weak.expect
index 7aa96cc..16019e2 100644
--- a/pkg/front_end/testcases/enhanced_enums/members.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/members.dart.weak.expect
@@ -33,7 +33,7 @@
     ;
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
-  static factory f<X extends core::Object? = dynamic>() → self::E2<dynamic>
+  static factory f<X extends core::Object? = dynamic>() → self::E2<self::E2::f::X%>
     return throw 42;
   method method(core::int value) → core::int
     return value.{core::num::+}(10){(core::num) → core::int};
diff --git a/pkg/front_end/testcases/enhanced_enums/members.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/members.dart.weak.modular.expect
index 7aa96cc..16019e2 100644
--- a/pkg/front_end/testcases/enhanced_enums/members.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/members.dart.weak.modular.expect
@@ -33,7 +33,7 @@
     ;
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
-  static factory f<X extends core::Object? = dynamic>() → self::E2<dynamic>
+  static factory f<X extends core::Object? = dynamic>() → self::E2<self::E2::f::X%>
     return throw 42;
   method method(core::int value) → core::int
     return value.{core::num::+}(10){(core::num) → core::int};
diff --git a/pkg/front_end/testcases/enhanced_enums/members.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/members.dart.weak.outline.expect
index f6877f8..65b7311 100644
--- a/pkg/front_end/testcases/enhanced_enums/members.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/members.dart.weak.outline.expect
@@ -33,7 +33,7 @@
     ;
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
-  static factory f<X extends core::Object? = dynamic>() → self::E2<dynamic>
+  static factory f<X extends core::Object? = dynamic>() → self::E2<self::E2::f::X%>
     ;
   method method(core::int value) → core::int
     ;
diff --git a/pkg/front_end/testcases/enhanced_enums/members.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/members.dart.weak.transformed.expect
index 7aa96cc..16019e2 100644
--- a/pkg/front_end/testcases/enhanced_enums/members.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/members.dart.weak.transformed.expect
@@ -33,7 +33,7 @@
     ;
   method toString() → core::String
     return "E2.${this.{core::_Enum::_name}{core::String}}";
-  static factory f<X extends core::Object? = dynamic>() → self::E2<dynamic>
+  static factory f<X extends core::Object? = dynamic>() → self::E2<self::E2::f::X%>
     return throw 42;
   method method(core::int value) → core::int
     return value.{core::num::+}(10){(core::num) → core::int};
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 35116bf..6afc196 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -30,6 +30,7 @@
 dart2js/late_statics: FormatterCrash
 enhanced_enums/entries_with_type_arguments: FormatterCrash
 enhanced_enums/inference_in_constructor_parameters: FormatterCrash
+enhanced_enums/instantiated_generic_enum_types: FormatterCrash
 enhanced_enums/issue48084: FormatterCrash
 enhanced_enums/members: FormatterCrash
 enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash