library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:7:13: Error: 'element' is already declared in this scope.
//   final int element = 42; // Error.
//             ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:6:3: Context: Previous declaration of 'element'.
//   element;
//   ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:12:3: Error: 'element' is already declared in this scope.
//   element; // Error.
//   ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:11:3: Context: Previous declaration of 'element'.
//   element,
//   ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:18:8: Error: 'element' is already declared in this scope.
//   void element() {} // Error.
//        ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:16:3: Context: Previous declaration of 'element'.
//   element;
//   ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:24:15: Error: 'element' is already declared in this scope.
//   static void element() {} // Error.
//               ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:22:3: Context: Previous declaration of 'element'.
//   element;
//   ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:30:14: Error: 'element' is already declared in this scope.
//   static int element = 42; // Error.
//              ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:28:3: Context: Previous declaration of 'element'.
//   element;
//   ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:34:3: Error: This static member conflicts with an instance member.
//   element; // Error.
//   ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:36:12: Context: This is the instance member.
//   void set element(E6 value) {}
//            ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:50:3: Error: Can't declare a member that conflicts with an inherited one.
//   element // Error.
//   ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:46:12: Context: This is the inherited member.
//   void set element(dynamic value) {}
//            ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:58:3: Error: Can't declare a member that conflicts with an inherited one.
//   element // Error.
//   ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:54:7: Context: This is the inherited member.
//   int element = 42;
//       ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:66:3: Error: Can't declare a member that conflicts with an inherited one.
//   element // Error.
//   ^^^^^^^
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:62:8: Context: This is the inherited member.
//   void element() {}
//        ^^^^^^^
//
// pkg/front_end/testcases/enhanced_enums/conflicting_elements.dart:57:6: Error: A constant constructor can't call a non-constant super constructor.
// enum E9 with A9 {
//      ^
//
import self as self;
import "dart:core" as core;

class E1 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E1> values = #C1;
  final field core::int element = null;
  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}}";
}
class E2 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E2> values = #C5;
  static const field self::E2 element = #C4;
  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}}";
}
class E3 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E3> values = #C6;
  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}}";
  method element() → void {}
}
class E4 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E4> values = #C7;
  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}}";
  static method element() → void {}
}
class E5 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E5> values = #C8;
  static field core::int element = null;
  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}}";
}
class E6 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E6> values = #C10;
  static const field self::E6 element = #C9;
  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}}";
  set element(self::E6 value) → void {}
}
class E7 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E7> values = #C12;
  static const field self::E7 element = #C11;
  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}}";
  static set element(self::E7 value) → void {}
}
class A8 extends core::Object {
  synthetic constructor •() → self::A8
    : super core::Object::•()
    ;
  set element(dynamic value) → void {}
}
abstract class _E8&_Enum&A8 extends core::_Enum implements self::A8 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E8&_Enum&A8
    : super core::_Enum::•(index, _name)
    ;
  set element(dynamic value) → void {}
}
class E8 extends self::_E8&_Enum&A8 /*isEnum*/  {
  static const field core::List<self::E8> values = #C14;
  static const field self::E8 element = #C13;
  const constructor •(core::int #index, core::String #name) → self::E8
    : super self::_E8&_Enum&A8::•(#index, #name)
    ;
  method toString() → core::String
    return "E8.${this.{core::_Enum::_name}{core::String}}";
}
class A9 extends core::Object {
  field core::int element = 42;
  synthetic constructor •() → self::A9
    : super core::Object::•()
    ;
}
abstract class _E9&_Enum&A9 extends core::_Enum implements self::A9 /*isAnonymousMixin,isEliminatedMixin*/  {
  field core::int element = 42;
  synthetic constructor •(core::int index, core::String _name) → self::_E9&_Enum&A9
    : super core::_Enum::•(index, _name)
    ;
}
class E9 extends self::_E9&_Enum&A9 /*isEnum*/  {
  static const field core::List<self::E9> values = invalid-expression "A constant constructor can't call a non-constant super constructor.";
  static const field self::E9 element = invalid-expression "A constant constructor can't call a non-constant super constructor.";
  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}}";
}
class A10 extends core::Object {
  synthetic constructor •() → self::A10
    : super core::Object::•()
    ;
  method element() → void {}
}
abstract class _E10&_Enum&A10 extends core::_Enum implements self::A10 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E10&_Enum&A10
    : super core::_Enum::•(index, _name)
    ;
  method element() → void {}
}
class E10 extends self::_E10&_Enum&A10 /*isEnum*/  {
  static const field core::List<self::E10> values = #C16;
  static const field self::E10 element = #C15;
  const constructor •(core::int #index, core::String #name) → self::E10
    : super self::_E10&_Enum&A10::•(#index, #name)
    ;
  method toString() → core::String
    return "E10.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants  {
  #C1 = <self::E1>[]
  #C2 = 0
  #C3 = "element"
  #C4 = self::E2 {index:#C2, _name:#C3}
  #C5 = <self::E2>[#C4]
  #C6 = <self::E3>[]
  #C7 = <self::E4>[]
  #C8 = <self::E5>[]
  #C9 = self::E6 {index:#C2, _name:#C3}
  #C10 = <self::E6>[#C9]
  #C11 = self::E7 {index:#C2, _name:#C3}
  #C12 = <self::E7>[#C11]
  #C13 = self::E8 {index:#C2, _name:#C3}
  #C14 = <self::E8>[#C13]
  #C15 = self::E10 {index:#C2, _name:#C3}
  #C16 = <self::E10>[#C15]
}


Constructor coverage from constants:
org-dartlang-testcase:///conflicting_elements.dart:
- E2. (from org-dartlang-testcase:///conflicting_elements.dart:10: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)
- E6. (from org-dartlang-testcase:///conflicting_elements.dart:33:6)
- E7. (from org-dartlang-testcase:///conflicting_elements.dart:39:6)
- E8. (from org-dartlang-testcase:///conflicting_elements.dart:49:6)
- _E8&_Enum&A8. (from org-dartlang-testcase:///conflicting_elements.dart:49:6)
- E9. (from org-dartlang-testcase:///conflicting_elements.dart:57:6)
- E10. (from org-dartlang-testcase:///conflicting_elements.dart:65:6)
- _E10&_Enum&A10. (from org-dartlang-testcase:///conflicting_elements.dart:65:6)
