library /*isNonNullableByDefault*/;
//
// 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];
  static const field self::E1 element = const self::E1::•(0, "element");
  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}}";
  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];
  static const field self::E2 element = const self::E2::•(0, "element");
  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}}";
  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];
  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}}";
}
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
