library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:17:6: Error: Can't declare a member that conflicts with an inherited one.
// enum E2 with A2 { // Error.
//      ^^^^^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:14:11: Context: This is the inherited member.
//   int get values => 42;
//           ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:49:6: Error: Can't declare a member that conflicts with an inherited one.
// enum E6 with M6 { // Error.
//      ^^^^^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:46:11: Context: This is the inherited member.
//   int get values => 42;
//           ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:9:6: Error: An enum can't inherit a member named 'hashCode'.
// enum E1 with A1 { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:6:11: Context: This is the inherited member
//   int get hashCode => 42;
//           ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:17:6: Error: An enum can't inherit a member named 'values'.
// enum E2 with A2 { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:14:11: Context: This is the inherited member
//   int get values => 42;
//           ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:25:6: Error: An enum can't inherit a member named 'index'.
// enum E3 with A3 { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:22:11: Context: This is the inherited member
//   int get index => 42;
//           ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:33:6: Error: An enum can't inherit a member named '=='.
// enum E4 with A4 { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:30:16: Context: This is the inherited member
//   bool operator==(Object other) => true;
//                ^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:41:6: Error: An enum can't inherit a member named 'hashCode'.
// enum E5 with M5 { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:38:11: Context: This is the inherited member
//   int get hashCode => 42;
//           ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:49:6: Error: An enum can't inherit a member named 'values'.
// enum E6 with M6 { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:46:11: Context: This is the inherited member
//   int get values => 42;
//           ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:57:6: Error: An enum can't inherit a member named 'index'.
// enum E7 with M7 { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:54:11: Context: This is the inherited member
//   int get index => 42;
//           ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:65:6: Error: An enum can't inherit a member named '=='.
// enum E8 with M8 { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/inherited_restricted_members.dart:62:16: Context: This is the inherited member
//   bool operator==(Object other) => true;
//                ^^
//
import self as self;
import "dart:core" as core;

class A1 extends core::Object {
  synthetic constructor •() → self::A1
    : super core::Object::•()
    ;
  get hashCode() → core::int
    return 42;
}
abstract class _E1&_Enum&A1 extends core::_Enum implements self::A1 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E1&_Enum&A1
    : super core::_Enum::•(index, _name)
    ;
  get hashCode() → core::int
    return 42;
}
class E1 extends self::_E1&_Enum&A1 /*isEnum*/  {
  static const field core::List<self::E1> values = #C4;
  static const field self::E1 element = #C3;
  const constructor •(core::int index, core::String name) → self::E1
    : super self::_E1&_Enum&A1::•(index, name)
    ;
  method toString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
}
class A2 extends core::Object {
  synthetic constructor •() → self::A2
    : super core::Object::•()
    ;
  get values() → core::int
    return 42;
}
abstract class _E2&_Enum&A2 extends core::_Enum implements self::A2 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E2&_Enum&A2
    : super core::_Enum::•(index, _name)
    ;
  get values() → core::int
    return 42;
}
class E2 extends self::_E2&_Enum&A2 /*isEnum*/  {
  static const field core::List<self::E2> values = #C6;
  static const field self::E2 element = #C5;
  const constructor •(core::int index, core::String name) → self::E2
    : super self::_E2&_Enum&A2::•(index, name)
    ;
  method toString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
class A3 extends core::Object {
  synthetic constructor •() → self::A3
    : super core::Object::•()
    ;
  get index() → core::int
    return 42;
}
abstract class _E3&_Enum&A3 extends core::_Enum implements self::A3 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E3&_Enum&A3
    : super core::_Enum::•(index, _name)
    ;
  get index() → core::int
    return 42;
}
class E3 extends self::_E3&_Enum&A3 /*isEnum*/  {
  static const field core::List<self::E3> values = #C8;
  static const field self::E3 element = #C7;
  const constructor •(core::int index, core::String name) → self::E3
    : super self::_E3&_Enum&A3::•(index, name)
    ;
  method toString() → core::String
    return "E3.${this.{core::_Enum::_name}{core::String}}";
}
class A4 extends core::Object {
  synthetic constructor •() → self::A4
    : super core::Object::•()
    ;
  operator ==(core::Object other) → core::bool
    return true;
}
abstract class _E4&_Enum&A4 extends core::_Enum implements self::A4 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E4&_Enum&A4
    : super core::_Enum::•(index, _name)
    ;
  operator ==(core::Object other) → core::bool
    return true;
}
class E4 extends self::_E4&_Enum&A4 /*isEnum*/  {
  static const field core::List<self::E4> values = #C10;
  static const field self::E4 element = #C9;
  const constructor •(core::int index, core::String name) → self::E4
    : super self::_E4&_Enum&A4::•(index, name)
    ;
  method toString() → core::String
    return "E4.${this.{core::_Enum::_name}{core::String}}";
}
abstract class M5 extends core::Object /*isMixinDeclaration*/  {
  get hashCode() → core::int
    return 42;
}
abstract class _E5&_Enum&M5 extends core::_Enum implements self::M5 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E5&_Enum&M5
    : super core::_Enum::•(index, _name)
    ;
  get hashCode() → core::int
    return 42;
}
class E5 extends self::_E5&_Enum&M5 /*isEnum*/  {
  static const field core::List<self::E5> values = #C12;
  static const field self::E5 element = #C11;
  const constructor •(core::int index, core::String name) → self::E5
    : super self::_E5&_Enum&M5::•(index, name)
    ;
  method toString() → core::String
    return "E5.${this.{core::_Enum::_name}{core::String}}";
}
abstract class M6 extends core::Object /*isMixinDeclaration*/  {
  get values() → core::int
    return 42;
}
abstract class _E6&_Enum&M6 extends core::_Enum implements self::M6 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E6&_Enum&M6
    : super core::_Enum::•(index, _name)
    ;
  get values() → core::int
    return 42;
}
class E6 extends self::_E6&_Enum&M6 /*isEnum*/  {
  static const field core::List<self::E6> values = #C14;
  static const field self::E6 element = #C13;
  const constructor •(core::int index, core::String name) → self::E6
    : super self::_E6&_Enum&M6::•(index, name)
    ;
  method toString() → core::String
    return "E6.${this.{core::_Enum::_name}{core::String}}";
}
abstract class M7 extends core::Object /*isMixinDeclaration*/  {
  get index() → core::int
    return 42;
}
abstract class _E7&_Enum&M7 extends core::_Enum implements self::M7 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&M7
    : super core::_Enum::•(index, _name)
    ;
  get index() → core::int
    return 42;
}
class E7 extends self::_E7&_Enum&M7 /*isEnum*/  {
  static const field core::List<self::E7> values = #C16;
  static const field self::E7 element = #C15;
  const constructor •(core::int index, core::String name) → self::E7
    : super self::_E7&_Enum&M7::•(index, name)
    ;
  method toString() → core::String
    return "E7.${this.{core::_Enum::_name}{core::String}}";
}
abstract class M8 extends core::Object /*isMixinDeclaration*/  {
  operator ==(core::Object other) → core::bool
    return true;
}
abstract class _E8&_Enum&M8 extends core::_Enum implements self::M8 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E8&_Enum&M8
    : super core::_Enum::•(index, _name)
    ;
  operator ==(core::Object other) → core::bool
    return true;
}
class E8 extends self::_E8&_Enum&M8 /*isEnum*/  {
  static const field core::List<self::E8> values = #C18;
  static const field self::E8 element = #C17;
  const constructor •(core::int index, core::String name) → self::E8
    : super self::_E8&_Enum&M8::•(index, name)
    ;
  method toString() → core::String
    return "E8.${this.{core::_Enum::_name}{core::String}}";
}
abstract class A9 extends core::Object {
  synthetic constructor •() → self::A9
    : super core::Object::•()
    ;
  abstract get index() → core::int;
  abstract get hashCode() → core::int;
  abstract operator ==(core::Object other) → core::bool;
}
abstract class _E9&_Enum&A9 extends core::_Enum implements self::A9 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E9&_Enum&A9
    : super core::_Enum::•(index, _name)
    ;
  abstract get index() → core::int;
  abstract get hashCode() → core::int;
  abstract operator ==(core::Object other) → core::bool;
}
class E9 extends self::_E9&_Enum&A9 /*isEnum*/  {
  static const field core::List<self::E9> values = #C20;
  static const field self::E9 element = #C19;
  const constructor •(core::int index, core::String name) → self::E9
    : super self::_E9&_Enum&A9::•(index, name)
    ;
  method toString() → core::String
    return "E9.${this.{core::_Enum::_name}{core::String}}";
}
abstract class M10 extends core::Object /*isMixinDeclaration*/  {
  abstract get index() → core::int;
  abstract get hashCode() → core::int;
  abstract operator ==(core::Object other) → core::bool;
}
abstract class _E10&_Enum&M10 extends core::_Enum implements self::M10 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E10&_Enum&M10
    : super core::_Enum::•(index, _name)
    ;
  abstract get index() → core::int;
  abstract get hashCode() → core::int;
  abstract operator ==(core::Object other) → core::bool;
}
class E10 extends self::_E10&_Enum&M10 /*isEnum*/  {
  static const field core::List<self::E10> values = #C22;
  static const field self::E10 element = #C21;
  const constructor •(core::int index, core::String name) → self::E10
    : super self::_E10&_Enum&M10::•(index, name)
    ;
  method toString() → core::String
    return "E10.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants  {
  #C1 = 0
  #C2 = "element"
  #C3 = self::E1 {index:#C1, _name:#C2}
  #C4 = <self::E1*>[#C3]
  #C5 = self::E2 {index:#C1, _name:#C2}
  #C6 = <self::E2*>[#C5]
  #C7 = self::E3 {index:#C1, _name:#C2}
  #C8 = <self::E3*>[#C7]
  #C9 = self::E4 {index:#C1, _name:#C2}
  #C10 = <self::E4*>[#C9]
  #C11 = self::E5 {index:#C1, _name:#C2}
  #C12 = <self::E5*>[#C11]
  #C13 = self::E6 {index:#C1, _name:#C2}
  #C14 = <self::E6*>[#C13]
  #C15 = self::E7 {index:#C1, _name:#C2}
  #C16 = <self::E7*>[#C15]
  #C17 = self::E8 {index:#C1, _name:#C2}
  #C18 = <self::E8*>[#C17]
  #C19 = self::E9 {index:#C1, _name:#C2}
  #C20 = <self::E9*>[#C19]
  #C21 = self::E10 {index:#C1, _name:#C2}
  #C22 = <self::E10*>[#C21]
}


Constructor coverage from constants:
org-dartlang-testcase:///inherited_restricted_members.dart:
- E1. (from org-dartlang-testcase:///inherited_restricted_members.dart:9:6)
- _E1&_Enum&A1. (from org-dartlang-testcase:///inherited_restricted_members.dart:9:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- E2. (from org-dartlang-testcase:///inherited_restricted_members.dart:17:6)
- _E2&_Enum&A2. (from org-dartlang-testcase:///inherited_restricted_members.dart:17:6)
- E3. (from org-dartlang-testcase:///inherited_restricted_members.dart:25:6)
- _E3&_Enum&A3. (from org-dartlang-testcase:///inherited_restricted_members.dart:25:6)
- E4. (from org-dartlang-testcase:///inherited_restricted_members.dart:33:6)
- _E4&_Enum&A4. (from org-dartlang-testcase:///inherited_restricted_members.dart:33:6)
- E5. (from org-dartlang-testcase:///inherited_restricted_members.dart:41:6)
- _E5&_Enum&M5. (from org-dartlang-testcase:///inherited_restricted_members.dart:41:6)
- E6. (from org-dartlang-testcase:///inherited_restricted_members.dart:49:6)
- _E6&_Enum&M6. (from org-dartlang-testcase:///inherited_restricted_members.dart:49:6)
- E7. (from org-dartlang-testcase:///inherited_restricted_members.dart:57:6)
- _E7&_Enum&M7. (from org-dartlang-testcase:///inherited_restricted_members.dart:57:6)
- E8. (from org-dartlang-testcase:///inherited_restricted_members.dart:65:6)
- _E8&_Enum&M8. (from org-dartlang-testcase:///inherited_restricted_members.dart:65:6)
- E9. (from org-dartlang-testcase:///inherited_restricted_members.dart:75:6)
- _E9&_Enum&A9. (from org-dartlang-testcase:///inherited_restricted_members.dart:75:6)
- E10. (from org-dartlang-testcase:///inherited_restricted_members.dart:85:6)
- _E10&_Enum&M10. (from org-dartlang-testcase:///inherited_restricted_members.dart:85:6)
