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:103: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)
