library;
//
// 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:9: Error: Couldn't find constructor 'E.f'.
//   three.f(), // Error.
//         ^
//
// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:8: 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:9: Error: Couldn't find constructor 'E.f'.
  three.f(), // Error.
        ^";
  enum-element static const field self::E one = #C3;
  enum-element static const field self::E two = #C6;
  enum-element static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:9: Error: Couldn't find constructor 'E.f'.
  three.f(), // Error.
        ^";
  enum-element static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:8: Error: Couldn't find constructor 'E.f2'.
  four.f2(); // Error.
       ^^";
  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 _enumToString() → 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:9: 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 /* redirection-target: self::E::f */
    return self::E::f();
  static factory f6(core::int value = #C7) → 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.
        ^";
  #C8;
}
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 = null
  #C8 = 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)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
