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) → 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.
        ^";
  #C11;
}
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 = 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)
