library;
//
// 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;
  ^";
  enum-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 _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/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
  const E2.named1() : super(); // Error.
                      ^";
  enum-element 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.
                      ^";
  enum-element 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 _enumToString() → 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)
