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)
