library;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:8:11: Error: An enum can't declare a non-abstract member named 'index'.
//   int get index => 42; // Error.
//           ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:14:14: Error: An enum can't declare a non-abstract member named 'index'.
//   String get index => "foo"; // Error.
//              ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:20:13: Error: An enum can't declare a non-abstract member named 'index'.
//   final int index = 42; // Error.
//             ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:26:16: Error: An enum can't declare a non-abstract member named 'index'.
//   List<String> index() => []; // Error.
//                ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:32:13: Error: An enum can't declare a non-abstract member named 'index'.
//   Never get index => throw 42; // Error.
//             ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:38:22: Error: An enum can't declare a non-abstract member named 'index'.
//   final int foo = 0, index = 1, bar = 2; // Error.
//                      ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:64:18: Error: An enum can't declare a non-abstract member named 'index'.
//   static int get index => 42; // Error.
//                  ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:26:16: Error: Can't declare a member that conflicts with an inherited one.
//   List<String> index() => []; // Error.
//                ^^^^^
// sdk/lib/core/enum.dart:*: Context: This is the inherited member.
//   final int index;
//             ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:64:18: Error: Can't declare a member that conflicts with an inherited one.
//   static int get index => 42; // Error.
//                  ^^^^^
// sdk/lib/core/enum.dart:*: Context: This is the inherited member.
//   final int index;
//             ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:70:19: Error: Can't declare a member that conflicts with an inherited one.
//   static void set index(int value) {} // Error.
//                   ^^^^^
// sdk/lib/core/enum.dart:*: Context: This is the inherited member.
//   final int index;
//             ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:74:3: Error: Can't declare a member that conflicts with an inherited one.
//   index // Error.
//   ^^^^^
// sdk/lib/core/enum.dart:*: Context: This is the inherited member.
//   final int index;
//             ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:14:14: Error: The return type of the method 'E2.index' is 'String', which does not match the return type, 'int', of the overridden method, '_Enum.index'.
// Change to a subtype of 'int'.
//   String get index => "foo"; // Error.
//              ^
// sdk/lib/core/enum.dart:*: Context: This is the overridden method ('index').
//   final int index;
//             ^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:52:12: Error: The type 'int' of the inherited field '_Enum.index' is not a subtype of the type 'String' of the setter 'E8.index'.
//   void set index(String value) {} // Error.
//            ^^^^^
// sdk/lib/core/enum.dart:*: Context: This is the declaration of the field '_Enum.index'.
//   final int index;
//             ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:58:14: Error: The return type of the method 'E9.index' is 'double', which does not match the return type, 'int', of the overridden method, '_Enum.index'.
// Change to a subtype of 'int'.
//   double get index; // Error.
//              ^
// sdk/lib/core/enum.dart:*: Context: This is the overridden method ('index').
//   final int index;
//             ^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:55:6: Error: The implementation of 'index' in the non-abstract class 'E9' does not conform to its interface.
// enum E9 {
//      ^^
// sdk/lib/core/enum.dart:*: Context: The return type of the method '_Enum.index' is 'int', which does not match the return type, 'double', of the overridden method, 'E9.index'.
// Change to a subtype of 'double'.
//   final int index;
//             ^
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:58:14: Context: This is the overridden method ('index').
//   double get index; // Error.
//              ^
//
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:87:6: Error: The implementation of 'index' in the non-abstract class 'E14' does not conform to its interface.
// enum E14 implements I14 { element } // Error.
//      ^^^
// sdk/lib/core/enum.dart:*: Context: The return type of the method '_Enum.index' is 'int', which does not match the return type, 'Never', of the overridden method, 'I14.index'.
// Change to a subtype of 'Never'.
//   final int index;
//             ^
// pkg/front_end/testcases/enhanced_enums/declared_index.dart:84:13: Context: This is the overridden method ('index').
//   Never get index;
//             ^
//
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 synthetic 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}}";
  get index() → core::int
    return 42;
}
class E2 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E2> values = #C6;
  enum-element static const field self::E2 element = #C5;
  const synthetic constructor •(core::int #index, core::String #name) → self::E2
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
  get index() → core::String
    return "foo";
}
class E3 extends core::_Enum /*isEnum*/  {
  final field core::int index = 42;
  static const field core::List<self::E3> values = #C9;
  enum-element static const field self::E3 element = #C8;
  const synthetic constructor •(core::int #index, core::String #name) → self::E3
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E3.${this.{core::_Enum::_name}{core::String}}";
}
class E4 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E4> values = #C11;
  enum-element static const field self::E4 element = #C10;
  const synthetic constructor •(core::int #index, core::String #name) → self::E4
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E4.${this.{core::_Enum::_name}{core::String}}";
  method index() → core::List<core::String>
    return <core::String>[];
}
class E5 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E5> values = #C13;
  enum-element static const field self::E5 element = #C12;
  const synthetic constructor •(core::int #index, core::String #name) → self::E5
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E5.${this.{core::_Enum::_name}{core::String}}";
  get index() → Never
    return throw 42;
}
class E6 extends core::_Enum /*isEnum*/  {
  final field core::int foo = 0;
  final field core::int index = 1;
  final field core::int bar = 2;
  static const field core::List<self::E6> values = #C17;
  enum-element static const field self::E6 element = #C16;
  const synthetic constructor •(core::int #index, core::String #name) → self::E6
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E6.${this.{core::_Enum::_name}{core::String}}";
}
class E7 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E7> values = #C19;
  enum-element static const field self::E7 element = #C18;
  const synthetic constructor •(core::int #index, core::String #name) → self::E7
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E7.${this.{core::_Enum::_name}{core::String}}";
  set index(core::int value) → void {}
  abstract get index() → core::int;
}
class E8 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E8> values = #C21;
  enum-element static const field self::E8 element = #C20;
  const synthetic constructor •(core::int #index, core::String #name) → self::E8
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E8.${this.{core::_Enum::_name}{core::String}}";
  set index(core::String value) → void {}
}
class E9 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E9> values = #C23;
  enum-element static const field self::E9 element = #C22;
  const synthetic constructor •(core::int #index, core::String #name) → self::E9
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E9.${this.{core::_Enum::_name}{core::String}}";
  abstract get index() → core::double;
}
class E10 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E10> values = #C25;
  enum-element static const field self::E10 element = #C24;
  const synthetic constructor •(core::int #index, core::String #name) → self::E10
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E10.${this.{core::_Enum::_name}{core::String}}";
  static get index() → core::int
    return 42;
}
class E11 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E11> values = #C27;
  enum-element static const field self::E11 element = #C26;
  const synthetic constructor •(core::int #index, core::String #name) → self::E11
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E11.${this.{core::_Enum::_name}{core::String}}";
  static set index(core::int value) → void {}
}
class E12 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E12> values = #C30;
  enum-element static const field self::E12 index = #C29;
  const synthetic constructor •(core::int #index, core::String #name) → self::E12
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E12.${this.{core::_Enum::_name}{core::String}}";
}
abstract class I13 extends core::Object {
  synthetic constructor •() → self::I13
    : super core::Object::•()
    ;
  abstract get index() → core::int;
}
class E13 extends core::_Enum implements self::I13 /*isEnum*/  {
  static const field core::List<self::E13> values = #C32;
  enum-element static const field self::E13 element = #C31;
  const synthetic constructor •(core::int #index, core::String #name) → self::E13
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E13.${this.{core::_Enum::_name}{core::String}}";
}
abstract class I14 extends core::Object {
  synthetic constructor •() → self::I14
    : super core::Object::•()
    ;
  abstract get index() → Never;
}
class E14 extends core::_Enum implements self::I14 /*isEnum*/  {
  static const field core::List<self::E14> values = #C34;
  enum-element static const field self::E14 element = #C33;
  const synthetic constructor •(core::int #index, core::String #name) → self::E14
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E14.${this.{core::_Enum::_name}{core::String}}";
  abstract member-signature get index() → Never; -> self::I14::index
}
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 = 42
  #C8 = self::E3 {index:#C7, index:#C1, _name:#C2}
  #C9 = <self::E3>[#C8]
  #C10 = self::E4 {index:#C1, _name:#C2}
  #C11 = <self::E4>[#C10]
  #C12 = self::E5 {index:#C1, _name:#C2}
  #C13 = <self::E5>[#C12]
  #C14 = 1
  #C15 = 2
  #C16 = self::E6 {foo:#C1, index:#C14, bar:#C15, index:#C1, _name:#C2}
  #C17 = <self::E6>[#C16]
  #C18 = self::E7 {index:#C1, _name:#C2}
  #C19 = <self::E7>[#C18]
  #C20 = self::E8 {index:#C1, _name:#C2}
  #C21 = <self::E8>[#C20]
  #C22 = self::E9 {index:#C1, _name:#C2}
  #C23 = <self::E9>[#C22]
  #C24 = self::E10 {index:#C1, _name:#C2}
  #C25 = <self::E10>[#C24]
  #C26 = self::E11 {index:#C1, _name:#C2}
  #C27 = <self::E11>[#C26]
  #C28 = "index"
  #C29 = self::E12 {index:#C1, _name:#C28}
  #C30 = <self::E12>[#C29]
  #C31 = self::E13 {index:#C1, _name:#C2}
  #C32 = <self::E13>[#C31]
  #C33 = self::E14 {index:#C1, _name:#C2}
  #C34 = <self::E14>[#C33]
}


Constructor coverage from constants:
org-dartlang-testcase:///declared_index.dart:
- E1. (from org-dartlang-testcase:///declared_index.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:///declared_index.dart:11:6)
- E3. (from org-dartlang-testcase:///declared_index.dart:17:6)
- E4. (from org-dartlang-testcase:///declared_index.dart:23:6)
- E5. (from org-dartlang-testcase:///declared_index.dart:29:6)
- E6. (from org-dartlang-testcase:///declared_index.dart:35:6)
- E7. (from org-dartlang-testcase:///declared_index.dart:41:6)
- E8. (from org-dartlang-testcase:///declared_index.dart:49:6)
- E9. (from org-dartlang-testcase:///declared_index.dart:55:6)
- E10. (from org-dartlang-testcase:///declared_index.dart:61:6)
- E11. (from org-dartlang-testcase:///declared_index.dart:67:6)
- E12. (from org-dartlang-testcase:///declared_index.dart:73:6)
- E13. (from org-dartlang-testcase:///declared_index.dart:81:6)
- E14. (from org-dartlang-testcase:///declared_index.dart:87:6)
