library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:21:20: Error: Can't implement 'I' because it's marked with '?'.
// enum E3 implements I? { // Error.
//                    ^^
//
// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:16:6: Error: The non-abstract class 'E2' is missing implementations for these members:
//  - I.foo
// Try to either
//  - provide an implementation,
//  - inherit an implementation from a superclass or mixin,
//  - mark the class as abstract, or
//  - provide a 'noSuchMethod' implementation.
//
// enum E2 implements I { // Error.
//      ^^
// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:6:8: Context: 'I.foo' is defined here.
//   void foo();
//        ^^^
//
// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
//  - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
//  - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
//   bar(e4); // Error.
//       ^
//
import self as self;
import "dart:core" as core;

abstract class I extends core::Object {
  synthetic constructor •() → self::I
    : super core::Object::•()
    ;
  abstract method foo() → void;
}
class E1 extends core::_Enum implements self::I /*isEnum*/  {
  static const field core::List<self::E1> values = #C7;
  static const field self::E1 one = #C3;
  static const field self::E1 two = #C6;
  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}}";
  method foo() → void {}
}
class E2 extends core::_Enum implements self::I /*isEnum*/  {
  static const field core::List<self::E2> values = #C10;
  static const field self::E2 one = #C8;
  static const field self::E2 two = #C9;
  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 implements self::I /*isEnum*/  {
  static const field core::List<self::E3> values = #C13;
  static const field self::E3 one = #C11;
  static const field self::E3 two = #C12;
  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 foo() → void {}
}
class E4 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E4> values = #C16;
  static const field self::E4 one = #C14;
  static const field self::E4 two = #C15;
  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}}";
  method foo() → void {}
}
static method bar(self::I i) → dynamic {}
static method test(self::E1 e1, self::E2 e2, self::E3 e3, self::E4 e4) → dynamic {
  self::bar(e1);
  self::bar(e2);
  self::bar(e3);
  self::bar(invalid-expression "pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:41:7: Error: The argument type 'E4' can't be assigned to the parameter type 'I'.
 - 'E4' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
 - 'I' is from 'pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart'.
  bar(e4); // Error.
      ^" in e4 as{TypeError,ForNonNullableByDefault} self::I);
}
static method main() → dynamic {}

constants  {
  #C1 = 0
  #C2 = "one"
  #C3 = self::E1 {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "two"
  #C6 = self::E1 {index:#C4, _name:#C5}
  #C7 = <self::E1*>[#C3, #C6]
  #C8 = self::E2 {index:#C1, _name:#C2}
  #C9 = self::E2 {index:#C4, _name:#C5}
  #C10 = <self::E2*>[#C8, #C9]
  #C11 = self::E3 {index:#C1, _name:#C2}
  #C12 = self::E3 {index:#C4, _name:#C5}
  #C13 = <self::E3*>[#C11, #C12]
  #C14 = self::E4 {index:#C1, _name:#C2}
  #C15 = self::E4 {index:#C4, _name:#C5}
  #C16 = <self::E4*>[#C14, #C15]
}


Constructor coverage from constants:
org-dartlang-testcase:///simple_interfaces.dart:
- E1. (from org-dartlang-testcase:///simple_interfaces.dart:9:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- E2. (from org-dartlang-testcase:///simple_interfaces.dart:16:6)
- E3. (from org-dartlang-testcase:///simple_interfaces.dart:21:6)
- E4. (from org-dartlang-testcase:///simple_interfaces.dart:28:6)
