library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
//   E1(); // Error.
//   ^
//
// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
//   E1.named(); // Error.
//   ^
//
// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
// Try using a constructor or factory that is 'const'.
//   element;
//   ^
//
// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
//   const E2.named1() : super(); // Error.
//                       ^
//
// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
//   const E2.named2() : super(42, "42"); // Error.
//                       ^
//
import self as self;
import "dart:core" as core;

class E1 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
Try using a constructor or factory that is 'const'.
  element;
  ^";
  static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
Try using a constructor or factory that is 'const'.
  element;
  ^";
  constructor •(core::int #index, core::String #name) → self::E1
    : super core::_Enum::•(#index, #name)
    ;
  constructor named(core::int #index, core::String #name) → self::E1
    : super core::_Enum::•(#index, #name)
    ;
  method toString() → 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/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
  const E2.named1() : super(); // Error.
                      ^";
  static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
  const E2.named1() : super(); // Error.
                      ^";
  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
  const E2.named2() : super(42, \"42\"); // Error.
                      ^";
  const constructor named1(core::int #index, core::String #name) → self::E2
    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
  const E2.named1() : super(); // Error.
                      ^"
    ;
  const constructor named2(core::int #index, core::String #name) → self::E2
    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
  const E2.named2() : super(42, \"42\"); // Error.
                      ^"
    ;
  method toString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}



Constructor coverage from constants:
org-dartlang-testcase:///malformed_constructors.dart:
- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
