library /*isNonNullableByDefault*/;
//
// 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:24:11: 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:24:11: 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:24:11: 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:24:11: 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:24:11: 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:24:11: 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:24:11: 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:24:11: 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:24:11: 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;
  static const field self::E1 element = #C3;
  const constructor •(core::int index, core::String name) → self::E1
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E2 element = #C5;
  const constructor •(core::int index, core::String name) → self::E2
    : super core::_Enum::•(index, name)
    ;
  method toString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
  get hashCode() → core::String
    return "foo";
}
class E3 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E3> values = #C9;
  final field core::int hashCode = 42;
  static const field self::E3 element = #C8;
  const constructor •(core::int index, core::String name) → self::E3
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E4 element = #C10;
  const constructor •(core::int index, core::String name) → self::E4
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E5 element = #C12;
  const constructor •(core::int index, core::String name) → self::E5
    : super core::_Enum::•(index, name)
    ;
  method toString() → core::String
    return "E5.${this.{core::_Enum::_name}{core::String}}";
  get hashCode() → Never
    return throw 42;
}
class E6 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E6> values = #C17;
  final field core::int foo = 0;
  final field core::int hashCode = 1;
  final field core::int bar = 2;
  static const field self::E6 element = #C16;
  const constructor •(core::int index, core::String name) → self::E6
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E7 element = #C18;
  const constructor •(core::int index, core::String name) → self::E7
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E8 element = #C20;
  const constructor •(core::int index, core::String name) → self::E8
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E9 element = #C22;
  const constructor •(core::int index, core::String name) → self::E9
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E10 element = #C24;
  const constructor •(core::int index, core::String name) → self::E10
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E11 element = #C26;
  const constructor •(core::int index, core::String name) → self::E11
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E12 hashCode = #C29;
  const constructor •(core::int index, core::String name) → self::E12
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E13 element = #C31;
  const constructor •(core::int index, core::String name) → self::E13
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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;
  static const field self::E14 element = #C33;
  const constructor •(core::int index, core::String name) → self::E14
    : super core::_Enum::•(index, name)
    ;
  method toString() → 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:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- 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)
