library;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/simple_interfaces.dart:21:20: Error: Can't implement 'I?' because it's nullable.
// Try removing the question mark.
// 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;
  enum-element static const field self::E1 one = #C3;
  enum-element static const field self::E1 two = #C6;
  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}}";
  method foo() → void {}
}
class E2 extends core::_Enum implements self::I /*isEnum*/  {
  static const field core::List<self::E2> values = #C10;
  enum-element static const field self::E2 one = #C8;
  enum-element static const field self::E2 two = #C9;
  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}}";
}
class E3 extends core::_Enum implements self::I /*isEnum*/  {
  static const field core::List<self::E3> values = #C13;
  enum-element static const field self::E3 one = #C11;
  enum-element static const field self::E3 two = #C12;
  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 foo() → void {}
}
class E4 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E4> values = #C16;
  enum-element static const field self::E4 one = #C14;
  enum-element static const field self::E4 two = #C15;
  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}}";
  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} 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)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- 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)
