library;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:8:11: Error: An enum can't declare a non-abstract member named 'hashCode'.
//   int get hashCode => 42; // Error.
//           ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:14:14: Error: An enum can't declare a non-abstract member named 'hashCode'.
//   String get hashCode => "foo"; // Error.
//              ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:20:13: Error: An enum can't declare a non-abstract member named 'hashCode'.
//   final int hashCode = 42; // Error.
//             ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:26:16: Error: An enum can't declare a non-abstract member named 'hashCode'.
//   List<String> hashCode() => []; // Error.
//                ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:32:13: Error: An enum can't declare a non-abstract member named 'hashCode'.
//   Never get hashCode => throw 42; // Error.
//             ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:38:22: Error: An enum can't declare a non-abstract member named 'hashCode'.
//   final int foo = 0, hashCode = 1, bar = 2; // Error.
//                      ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:64:18: Error: An enum can't declare a non-abstract member named 'hashCode'.
//   static int get hashCode => 42; // Error.
//                  ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:26:16: Error: Can't declare a member that conflicts with an inherited one.
//   List<String> hashCode() => []; // Error.
//                ^^^^^^^^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: This is the inherited member.
//   int get hashCode => _getHash(this);
//           ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:64:18: Error: Can't declare a member that conflicts with an inherited one.
//   static int get hashCode => 42; // Error.
//                  ^^^^^^^^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: This is the inherited member.
//   int get hashCode => _getHash(this);
//           ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:70:19: Error: Can't declare a member that conflicts with an inherited one.
//   static void set hashCode(int value) {} // Error.
//                   ^^^^^^^^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: This is the inherited member.
//   int get hashCode => _getHash(this);
//           ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:74:3: Error: Can't declare a member that conflicts with an inherited one.
//   hashCode // Error.
//   ^^^^^^^^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: This is the inherited member.
//   int get hashCode => _getHash(this);
//           ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:14:14: Error: The return type of the method 'E2.hashCode' is 'String', which does not match the return type, 'int', of the overridden method, 'Object.hashCode'.
// Change to a subtype of 'int'.
//   String get hashCode => "foo"; // Error.
//              ^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: This is the overridden method ('hashCode').
//   int get hashCode => _getHash(this);
//           ^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:52:12: Error: The type 'int' of the inherited getter 'Object.hashCode' is not a subtype of the type 'String' of the setter 'E8.hashCode'.
//   void set hashCode(String value) {} // Error.
//            ^^^^^^^^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: This is the declaration of the getter 'Object.hashCode'.
//   int get hashCode => _getHash(this);
//           ^^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:58:14: Error: The return type of the method 'E9.hashCode' is 'double', which does not match the return type, 'int', of the overridden method, 'Object.hashCode'.
// Change to a subtype of 'int'.
//   double get hashCode; // Error.
//              ^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: This is the overridden method ('hashCode').
//   int get hashCode => _getHash(this);
//           ^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:55:6: Error: The implementation of 'hashCode' in the non-abstract class 'E9' does not conform to its interface.
// enum E9 {
//      ^^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: The return type of the method 'Object.hashCode' is 'int', which does not match the return type, 'double', of the overridden method, 'E9.hashCode'.
// Change to a subtype of 'double'.
//   int get hashCode => _getHash(this);
//           ^
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:58:14: Context: This is the overridden method ('hashCode').
//   double get hashCode; // Error.
//              ^
//
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:87:6: Error: The implementation of 'hashCode' in the non-abstract class 'E14' does not conform to its interface.
// enum E14 implements I14 { element } // Error.
//      ^^^
// sdk/lib/_internal/vm/lib/object_patch.dart:*: Context: The return type of the method 'Object.hashCode' is 'int', which does not match the return type, 'Never', of the overridden method, 'I14.hashCode'.
// Change to a subtype of 'Never'.
//   int get hashCode => _getHash(this);
//           ^
// pkg/front_end/testcases/enhanced_enums/declared_hashcode.dart:84:13: Context: This is the overridden method ('hashCode').
//   Never get hashCode;
//             ^
//
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 hashCode() → 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 hashCode() → core::String
    return "foo";
}
class E3 extends core::_Enum /*isEnum*/  {
  final field core::int hashCode = 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 hashCode() → 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 hashCode() → Never
    return throw 42;
}
class E6 extends core::_Enum /*isEnum*/  {
  final field core::int foo = 0;
  final field core::int hashCode = 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 hashCode(core::int value) → void {}
  abstract get hashCode() → 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 hashCode(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 hashCode() → 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 hashCode() → 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 hashCode(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 hashCode = #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 hashCode() → 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 hashCode() → 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 hashCode() → Never; -> self::I14::hashCode
}
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 {hashCode:#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, hashCode:#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 = "hashCode"
  #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_hashcode.dart:
- E1. (from org-dartlang-testcase:///declared_hashcode.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_hashcode.dart:11:6)
- E3. (from org-dartlang-testcase:///declared_hashcode.dart:17:6)
- E4. (from org-dartlang-testcase:///declared_hashcode.dart:23:6)
- E5. (from org-dartlang-testcase:///declared_hashcode.dart:29:6)
- E6. (from org-dartlang-testcase:///declared_hashcode.dart:35:6)
- E7. (from org-dartlang-testcase:///declared_hashcode.dart:41:6)
- E8. (from org-dartlang-testcase:///declared_hashcode.dart:49:6)
- E9. (from org-dartlang-testcase:///declared_hashcode.dart:55:6)
- E10. (from org-dartlang-testcase:///declared_hashcode.dart:61:6)
- E11. (from org-dartlang-testcase:///declared_hashcode.dart:67:6)
- E12. (from org-dartlang-testcase:///declared_hashcode.dart:73:6)
- E13. (from org-dartlang-testcase:///declared_hashcode.dart:81:6)
- E14. (from org-dartlang-testcase:///declared_hashcode.dart:87:6)
