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)
