library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
//   const factory E.f3() = E; // Error.
//                          ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
//   factory E.f4() = E; // Error.
//                    ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
//   three.f(), // Error.
//        ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
//   four.f2(); // Error.
//       ^^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
//   factory E.f6(int value) = E.f; // Error.
//                             ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
//     return const E(); // Error.
//                  ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
//   new E(); // Error.
//       ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
//   const E(); // Error.
//         ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
//   E.new; // Error.
//     ^^^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
//   new E.named(); // Error.
//       ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
//   const E().named(); // Error.
//         ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
//   E.named; // Error.
//     ^^^^^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
// Try using a constructor or factory that is 'const'.
//   const E.f(); // Error.
//         ^
//
import self as self;
import "dart:core" as core;

class E extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
  three.f(), // Error.
       ^";
  static const field self::E one = #C3;
  static const field self::E two = #C6;
  static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
  three.f(), // Error.
       ^";
  static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
  four.f2(); // Error.
      ^^";
  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
  const constructor •(core::int #index, core::String #name) → self::E
    : super core::_Enum::•(#index, #name)
    ;
  const constructor named(core::int #index, core::String #name) → self::E
    : this self::E::•(#index, #name)
    ;
  method toString() → core::String
    return "E.${this.{core::_Enum::_name}{core::String}}";
  static factory f() → self::E
    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
  three.f(), // Error.
       ^".{core::Iterable::first}{self::E};
  static factory f2() → self::E {
    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
    return const E(); // Error.
                 ^";
  }
  static factory f3() → self::E
    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
  const factory E.f3() = E; // Error.
                         ^";
  static factory f4() → self::E
    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
  factory E.f4() = E; // Error.
                   ^";
  static factory f5() → self::E
    return self::E::f();
  static factory f6(core::int value = #C11) → self::E
    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
 - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
  factory E.f6(int value) = E.f; // Error.
                            ^";
}
static method test() → dynamic {
  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
  new E(); // Error.
      ^";
  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
  const E(); // Error.
        ^";
  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
  E.new; // Error.
    ^^^";
  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
  new E.named(); // Error.
      ^";
  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
  const E().named(); // Error.
        ^"{dynamic}.named();
  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
  E.named; // Error.
    ^^^^^";
  self::E::f();
  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
Try using a constructor or factory that is 'const'.
  const E.f(); // Error.
        ^";
  #C12;
}
static method main() → dynamic {}

constants  {
  #C1 = 0
  #C2 = "one"
  #C3 = self::E {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "two"
  #C6 = self::E {index:#C4, _name:#C5}
  #C7 = constructor-tearoff self::E::f3
  #C8 = constructor-tearoff self::E::f4
  #C9 = constructor-tearoff self::E::f5
  #C10 = constructor-tearoff self::E::f6
  #C11 = null
  #C12 = constructor-tearoff self::E::f
}


Constructor coverage from constants:
org-dartlang-testcase:///constructor_calls.dart:
- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
