library;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/declared_values.dart:8:25: Error: An enum can't declare a member named 'values'.
//   static const List<E1> values = [E1.element]; // Error in E1.
//                         ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_values.dart:14:7: Error: An enum can't declare a member named 'values'.
//   int values = 42; // Error in E2.
//       ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_values.dart:21:7: Error: 'values' is already declared in this scope.
//   int values = 42; // Duplicate.
//       ^^^^^^
// pkg/front_end/testcases/enhanced_enums/declared_values.dart:20:25: Context: Previous declaration of 'values'.
//   static const List<E3> values = [E3.element]; // Error in E3.
//                         ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_values.dart:20:25: Error: An enum can't declare a member named 'values'.
//   static const List<E3> values = [E3.element]; // Error in E3.
//                         ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_values.dart:45:8: Error: An enum can't declare a member named 'values'.
//   void values() {} // Error in E7.
//        ^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/declared_values.dart:36:6: Error: The type 'List<E6>' of the getter 'E6.values' is not a subtype of the type 'Never' of the setter 'E6.values'.
//  - 'List' is from 'dart:core'.
//  - 'E6' is from 'pkg/front_end/testcases/enhanced_enums/declared_values.dart'.
// enum E6 {
//      ^^^^^...
// pkg/front_end/testcases/enhanced_enums/declared_values.dart:39:19: Context: This is the declaration of the setter 'E6.values'.
//   static void set values(Never x) {} // Error in E6.
//                   ^^^^^^
//
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}}";
}
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}}";
}
class E3 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E3> values = #C8;
  enum-element static const field self::E3 element = #C7;
  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 = #C10;
  enum-element static const field self::E4 element = #C9;
  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}}";
  static set values(core::List<self::E4> x) → void {}
}
class E5 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E5> values = #C12;
  enum-element static const field self::E5 element = #C11;
  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}}";
  static set values(dynamic x) → void {}
}
class E6 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E6> values = #C14;
  enum-element static const field self::E6 element = #C13;
  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}}";
  static set values(Never x) → void {}
}
class E7 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E7> values = #C16;
  enum-element static const field self::E7 element = #C15;
  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}}";
}
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]
}


Constructor coverage from constants:
org-dartlang-testcase:///declared_values.dart:
- E1. (from org-dartlang-testcase:///declared_values.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_values.dart:11:6)
- E3. (from org-dartlang-testcase:///declared_values.dart:17:6)
- E4. (from org-dartlang-testcase:///declared_values.dart:24:6)
- E5. (from org-dartlang-testcase:///declared_values.dart:30:6)
- E6. (from org-dartlang-testcase:///declared_values.dart:36:6)
- E7. (from org-dartlang-testcase:///declared_values.dart:42:6)
