library;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/declared_equals.dart:8:16: Error: An enum can't declare a non-abstract member named '=='.
//   bool operator==(Object other) => true; // Error.
//                ^^
//
import self as self;
import "dart:core" as core;

class E1 extends core::_Enum /*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
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
  operator ==(core::Object other) → core::bool
    ;
}
class E2 extends core::_Enum /*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
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
  abstract operator ==(core::Object other) → core::bool;
}
abstract class I3 extends core::Object {
  synthetic constructor •() → self::I3
    ;
  abstract operator ==(core::Object other) → core::bool;
}
class E3 extends core::_Enum implements self::I3 /*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}}";
}
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///declared_equals.dart:5:6 -> ListConstant(const <E1>[const E1{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///declared_equals.dart:6:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///declared_equals.dart:11:6 -> ListConstant(const <E2>[const E2{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///declared_equals.dart:12:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///declared_equals.dart:21:6 -> ListConstant(const <E3>[const E3{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///declared_equals.dart:21:25 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "element"})
Extra constant evaluation: evaluated: 21, effectively constant: 6
