library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

abstract class M extends core::Object /*isMixinDeclaration*/  {
  method toString() → core::String
    ;
}
abstract class A extends core::Object {
  synthetic constructor •() → self::A
    ;
  method toString() → core::String
    ;
}
abstract class B extends core::Object implements core::Enum {
  synthetic constructor •() → self::B
    ;
  method toString() → core::String
    ;
}
abstract class _E1&_Enum&M = core::_Enum with self::M /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E1&_Enum&M
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub method toString() → core::String
    return super.{self::M::toString}();
}
class E1 extends self::_E1&_Enum&M /*isEnum*/  {
  static const field core::List<self::E1> values = const <self::E1>[self::E1::element];
  static const field self::E1 element = const self::E1::•(0, "element");
  const constructor •(core::int #index, core::String #name) → self::E1
    ;
  method toString() → core::String
    return super.{self::_E1&_Enum&M::toString}();
}
abstract class _E2&_Enum&M = core::_Enum with self::M /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E2&_Enum&M
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub method toString() → core::String
    return super.{self::M::toString}();
}
class E2 extends self::_E2&_Enum&M /*isEnum*/  {
  static const field core::List<self::E2> values = const <self::E2>[self::E2::element];
  static const field self::E2 element = const self::E2::•(0, "element");
  const constructor •(core::int #index, core::String #name) → self::E2
    ;
  method toString() → core::String
    return super.{self::_E2&_Enum&M::toString}();
}
class E3 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E3> values = const <self::E3>[self::E3::element];
  static const field self::E3 element = const self::E3::•(0, "element");
  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 implements self::B /*isEnum*/  {
  static const field core::List<self::E4> values = const <self::E4>[self::E4::element];
  static const field self::E4 element = const self::E4::•(0, "element");
  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}}";
}
class E5 extends core::_Enum implements self::B /*isEnum*/  {
  static const field core::List<self::E5> values = const <self::E5>[self::E5::element];
  static const field self::E5 element = const self::E5::•(0, "element");
  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}}";
}
abstract class _E6&_Enum&A = core::_Enum with self::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E6&_Enum&A
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub method toString() → core::String
    return super.{self::A::toString}();
}
class E6 extends self::_E6&_Enum&A /*isEnum*/  {
  static const field core::List<self::E6> values = const <self::E6>[self::E6::element];
  static const field self::E6 element = const self::E6::•(0, "element");
  const constructor •(core::int #index, core::String #name) → self::E6
    ;
  method toString() → core::String
    return super.{self::_E6&_Enum&A::toString}();
}
abstract class _E7&_Enum&A = core::_Enum with self::A /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&A
    : super core::_Enum::•(index, _name)
    ;
  mixin-super-stub method toString() → core::String
    return super.{self::A::toString}();
}
class E7 extends self::_E7&_Enum&A /*isEnum*/  {
  static const field core::List<self::E7> values = const <self::E7>[self::E7::element];
  static const field self::E7 element = const self::E7::•(0, "element");
  const constructor •(core::int #index, core::String #name) → self::E7
    ;
  method toString() → core::String
    return super.{self::_E7&_Enum&A::toString}();
}
static method checkEqual(dynamic x, dynamic y) → dynamic
  ;
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:17:6 -> ListConstant(const <E1*>[const E1{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:18:3 -> InstanceConstant(const E1{})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:21:6 -> ListConstant(const <E2*>[const E2{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:22:3 -> InstanceConstant(const E2{})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:27:6 -> ListConstant(const <E3*>[const E3{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:28:3 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:33:6 -> ListConstant(const <E4*>[const E4{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:34:3 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:37:6 -> ListConstant(const <E5*>[const E5{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:38:3 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:43:6 -> ListConstant(const <E6*>[const E6{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:44:3 -> InstanceConstant(const E6{})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:47:6 -> ListConstant(const <E7*>[const E7{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:48:3 -> InstanceConstant(const E7{})
Extra constant evaluation: evaluated: 45, effectively constant: 14
