library;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:9:6: Error: Conflicts with type variable 'values'.
// enum E2<values> {
//      ^^^^^^
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:9:9: Context: This is the type variable.
// enum E2<values> {
//         ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:14:3: Error: Conflicts with type variable 'element'.
//   element; // Error.
//   ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:13:9: Context: This is the type variable.
// enum E3<element> {
//         ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:17:6: Error: The name 'values' is not a valid name for an enum. Try using a different name.
// enum values { // Error.
//      ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:33:16: Error: A concrete instance member named '==' can't be inherited from 'SuperclassWithEquals' in a class that implements 'Enum'.
// abstract class A1 extends SuperclassWithEquals implements Enum {} // Error.
//                ^
//
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:35:16: Error: A concrete instance member named 'hashCode' can't be inherited from 'SuperclassWithHashCode' in a class that implements 'Enum'.
// abstract class A2 extends SuperclassWithHashCode implements Enum {} // Error.
//                ^
//
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:37:16: Error: A concrete instance member named 'values' can't be inherited from 'SuperclassWithValues' in a class that implements 'Enum'.
// abstract class A3 extends SuperclassWithValues implements Enum {} // Error.
//                ^
//
// pkg/front_end/testcases/enhanced_enums/missed_checks.dart:18:3: Error: Couldn't find constructor 'values'.
//   element;
//   ^
//
import self as self;
import "dart:core" as core;

class E1 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E1> values = #C4;
  enum-element static const field self::E1 element = #C3;
  const constructor •(core::int #index, core::String #name) → self::E1
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
}
class E2<values extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E2<dynamic>> values = #C6;
  enum-element static const field self::E2<dynamic> element = #C5;
  const constructor •(core::int #index, core::String #name) → self::E2<self::E2::values%>
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
class E3<element extends core::Object? = dynamic> extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E3<dynamic>> values = #C8;
  enum-element static const field self::E3<dynamic> element = #C7;
  const constructor •(core::int #index, core::String #name) → self::E3<self::E3::element%>
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E3.${this.{core::_Enum::_name}{core::String}}";
}
class values extends core::_Enum /*isEnum*/  {
  static const field core::List<self::values> values = #C10;
  enum-element static const field self::values element = #C9;
  const constructor •(core::int #index, core::String #name) → self::values
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "values.${this.{core::_Enum::_name}{core::String}}";
}
abstract class SuperclassWithEquals extends core::Object {
  synthetic constructor •() → self::SuperclassWithEquals
    : super core::Object::•()
    ;
  operator ==(core::Object other) → core::bool
    return true;
}
abstract class SuperclassWithHashCode extends core::Object {
  synthetic constructor •() → self::SuperclassWithHashCode
    : super core::Object::•()
    ;
  get hashCode() → core::int
    return 0;
}
abstract class SuperclassWithValues extends core::Object {
  synthetic constructor •() → self::SuperclassWithValues
    : super core::Object::•()
    ;
  get values() → Never
    return throw 0;
}
abstract class A1 extends self::SuperclassWithEquals implements core::Enum {
  synthetic constructor •() → self::A1
    : super self::SuperclassWithEquals::•()
    ;
}
abstract class A2 extends self::SuperclassWithHashCode implements core::Enum {
  synthetic constructor •() → self::A2
    : super self::SuperclassWithHashCode::•()
    ;
}
abstract class A3 extends self::SuperclassWithValues implements core::Enum {
  synthetic constructor •() → self::A3
    : super self::SuperclassWithValues::•()
    ;
}
static method main() → dynamic {}

constants  {
  #C1 = 0
  #C2 = "element"
  #C3 = self::E1 {index:#C1, _name:#C2}
  #C4 = <self::E1>[#C3]
  #C5 = self::E2<dynamic> {index:#C1, _name:#C2}
  #C6 = <self::E2<dynamic>>[#C5]
  #C7 = self::E3<dynamic> {index:#C1, _name:#C2}
  #C8 = <self::E3<dynamic>>[#C7]
  #C9 = self::values {index:#C1, _name:#C2}
  #C10 = <self::values>[#C9]
}


Constructor coverage from constants:
org-dartlang-testcase:///missed_checks.dart:
- E1. (from org-dartlang-testcase:///missed_checks.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- E2. (from org-dartlang-testcase:///missed_checks.dart:9:6)
- E3. (from org-dartlang-testcase:///missed_checks.dart:13:6)
- values. (from org-dartlang-testcase:///missed_checks.dart:17:6)
