library;
import self as self;
import "dart:core" as core;

abstract class M extends core::Object /*isMixinDeclaration*/  {
  method toString() → core::String
    ;
}
abstract mixin 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];
  enum-element static const field self::E1 element = const self::E1::•(0, "element");
  const synthetic constructor •(core::int #index, core::String #name) → self::E1
    ;
  method _enumToString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
}
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];
  enum-element static const field self::E2 element = const self::E2::•(0, "element");
  const synthetic constructor •(core::int #index, core::String #name) → self::E2
    ;
  method _enumToString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
  method toString() → core::String
    ;
}
class E3 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E3> values = const <self::E3>[self::E3::element];
  enum-element static const field self::E3 element = const self::E3::•(0, "element");
  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}}";
  method toString() → 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];
  enum-element static const field self::E4 element = const self::E4::•(0, "element");
  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}}";
}
class E5 extends core::_Enum implements self::B /*isEnum*/  {
  static const field core::List<self::E5> values = const <self::E5>[self::E5::element];
  enum-element static const field self::E5 element = const self::E5::•(0, "element");
  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}}";
  method toString() → 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];
  enum-element static const field self::E6 element = const self::E6::•(0, "element");
  const synthetic constructor •(core::int #index, core::String #name) → self::E6
    ;
  method _enumToString() → core::String
    return "E6.${this.{core::_Enum::_name}{core::String}}";
}
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];
  enum-element static const field self::E7 element = const self::E7::•(0, "element");
  const synthetic constructor •(core::int #index, core::String #name) → self::E7
    ;
  method _enumToString() → core::String
    return "E7.${this.{core::_Enum::_name}{core::String}}";
  method toString() → core::String
    ;
}
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:17:18 -> InstanceConstant(const E1{})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:19:6 -> ListConstant(const <E2*>[const E2{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:20:3 -> InstanceConstant(const E2{})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:25:6 -> ListConstant(const <E3*>[const E3{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:26:3 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:31:6 -> ListConstant(const <E4*>[const E4{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:31:24 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:33:6 -> ListConstant(const <E5*>[const E5{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:34:3 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:39:6 -> ListConstant(const <E6*>[const E6{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:39:18 -> InstanceConstant(const E6{})
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49236.dart:41:6 -> ListConstant(const <E7*>[const E7{}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49236.dart:42:3 -> InstanceConstant(const E7{})
Extra constant evaluation: evaluated: 53, effectively constant: 14
