library;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
// Try removing the extra positional arguments.
//   const E2.named(int value) : this(value, value); // Error.
//                                   ^
//
// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:9: Error: Final field 'foo' is not initialized by this constructor.
// Try to initialize the field using an initializing formal or a field initializer.
//   const E2.named(int value) : this(value, value); // Error.
//         ^^^^^
// pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:19:13: Context: 'foo' is defined here.
//   final int foo;
//             ^^^
//
import self as self;
import "dart:core" as core;

class E1 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E1> values = #C8;
  final field core::int foo;
  enum-element static const field self::E1 one = #C4;
  enum-element static const field self::E1 two = #C7;
  const constructor •(core::int #index, core::String #name, core::int foo) → self::E1
    : self::E1::foo = foo, super core::_Enum::•(#index, #name)
    ;
  const constructor named(core::int #index, core::String #name, core::int value) → self::E1
    : this self::E1::•(#index, #name, value)
    ;
  method _enumToString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
}
class E2 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
Try removing the extra positional arguments.
  const E2.named(int value) : this(value, value); // Error.
                                  ^";
  final field core::int foo;
  enum-element static const field self::E2 one = #C9;
  enum-element static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
Try removing the extra positional arguments.
  const E2.named(int value) : this(value, value); // Error.
                                  ^";
  const constructor •(core::int #index, core::String #name, core::int foo) → self::E2
    : self::E2::foo = foo, super core::_Enum::•(#index, #name)
    ;
  const constructor named(core::int #index, core::String #name, core::int value) → self::E2
    : self::E2::foo = null, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart:22:35: Error: Too many positional arguments: 3 allowed, but 4 found.
Try removing the extra positional arguments.
  const E2.named(int value) : this(value, value); // Error.
                                  ^"
    ;
  method _enumToString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants  {
  #C1 = 1
  #C2 = 0
  #C3 = "one"
  #C4 = self::E1 {foo:#C1, index:#C2, _name:#C3}
  #C5 = 2
  #C6 = "two"
  #C7 = self::E1 {foo:#C5, index:#C1, _name:#C6}
  #C8 = <self::E1>[#C4, #C7]
  #C9 = self::E2 {foo:#C1, index:#C2, _name:#C3}
}


Constructor coverage from constants:
org-dartlang-testcase:///redirecting_initializers.dart:
- E1. (from org-dartlang-testcase:///redirecting_initializers.dart:11:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
- E1.named (from org-dartlang-testcase:///redirecting_initializers.dart:12:9)
- E2. (from org-dartlang-testcase:///redirecting_initializers.dart:21:9)
- E2.named (from org-dartlang-testcase:///redirecting_initializers.dart:22:9)
