// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Test errors required by new enhanced enum syntax.

// Enums must satisfy the same requirements as their induced class.
// That means no name conflicts, no static/instance member conflicts,
// and no type errors.
// Enum classes must implement their interface.
// They cannot override `Enum.index` or have any instance member named
// `values` or declare any name which will conflicts with a static
// constant getter named `values`.
//
// An enum declaration's generative constructors can never be referenced
// other than implicitly in creating the values and as target of redirecting
// generative constructors. All generative constructors must be const.
//
// An enum class cannot override `index` or implement anything named `values`.

// Helper mixins and also used as interfaces.
mixin GetFoo {
  int get foo => 42;
}

mixin SetFoo {
  void set foo(int _) {}
}

mixin MethodFoo {
  int foo() => 42;
}

mixin ValuesGetter {
  int get values => 42;
}

mixin IndexGetter {
  int get index => 42;
}

mixin NeverIndexGetter {
  Never get index => throw "Never!";
}

// "You cannot have two members with the same name in the same class---be
// they declared or inherited"

// Enums inherit members of `Object` and `index`.
// Enums implicitly declare `values` and their enum values (as static const
// getters.)

enum ConflictInstanceMembers {
  e1;
  int get foo => 42;
  int foo() => 37;
  //  ^^^
  // [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
  // [cfe] 'foo' is already declared in this scope.
}

// "It is an error if you have a static member named $m$ in your class
// and an instance member of the same basename"
enum ConflictStaticGetterInstanceMembers {
  e1;
  static int get foo => 42;
  //             ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
  int foo() => 37;
  //  ^
  // [cfe] 'foo' is already declared in this scope.
}

enum ConflictStaticSetterInstanceMembers {
  e1;
  static void set foo(int _) {}
  //              ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
  // [cfe] This static member conflicts with an instance member.
  int foo() => 37;
}

enum ConflictStaticInstanceProperty2 {
  e1;
  int get foo => 42;
  static void set foo(int _) {}
  //              ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
  // [cfe] This static member conflicts with an instance member.
}

// "It is an error if you have a static getter $v$
// and an instance setter \code{$v$=}"
enum ConflictStaticInstanceProperty {
  e1;
  static int get foo => 42;
  //             ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
  // [cfe] This static member conflicts with an instance member.
  void set foo(int _) {}
}


enum ConflictStaticInheritedFoo with MethodFoo {
  e1;
  static int get foo => 42;
  //             ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
  // [cfe] Can't declare a member that conflicts with an inherited one.
}

enum ConflictInheritedEnumValue with MethodFoo {
  foo;
//^^^
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
// [cfe] Can't declare a member that conflicts with an inherited one.
}

enum ConflictStaticEnumValues {
  e1,
  e1,
//^^
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
// [cfe] 'e1' is already declared in this scope.
  ;
}

enum ConflictStaticEnumValuesLooksDifferent {
  e1(),
  e1.value(42),
//^^
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
// [cfe] 'e1' is already declared in this scope.
  ;
  const ConflictStaticEnumValuesLooksDifferent();
  const ConflictStaticEnumValuesLooksDifferent.value( dynamic_);
}

enum ConflictInstanceGetterInheritedFooMethod with MethodFoo {
  e1;
  int get foo => 42;
  //      ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_FIELD_AND_METHOD
  // [cfe] Can't declare a member that conflicts with an inherited one.
}

enum ConflictStaticInstanceImplicitValues {
  e1;
  int get values => 42;
  //      ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
  // [cfe] An enum can't declare a member named 'values'.
}

enum ConflictStaticInstanceEnumValue {
  e1;
//^^
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
  int get e1 => 42;
  //      ^
  // [cfe] 'e1' is already declared in this scope.
}

enum ConflictEnumValueInheritedIndex {
  index;
//^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
// [cfe] Can't declare a member that conflicts with an inherited one.
}

enum ConflictEnumValueInheritedToString {
  toString;
//^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
// [cfe] 'toString' is already declared in this scope.
}

enum ConflictEnumValueImplicitValues {
  values;
//^^^^^^
// [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
// [cfe] 'values' is already declared in this scope.
}

enum ConflictEnumValueInheritedFoo with MethodFoo {
  foo;
//^^^
// [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
// [cfe] Can't declare a member that conflicts with an inherited one.
}

enum ConflictClassGetterSetterTypeInstance {
  e1;
  num get foo => 42;
  //      ^^^
  // [analyzer] COMPILE_TIME_ERROR.GETTER_NOT_SUBTYPE_SETTER_TYPES
  // [cfe] The type 'num' of the getter 'ConflictClassGetterSetterTypeInstance.foo' is not a subtype of the type 'int' of the setter 'ConflictClassGetterSetterTypeInstance.foo'.

  // Type of setter parameter must be subtype of type of getter.
  void set foo(int _) {}
}

enum ConflictClassGetterSetterTypeStatic {
  e1;
  static num get foo => 42;
  //             ^^^
  // [analyzer] COMPILE_TIME_ERROR.GETTER_NOT_SUBTYPE_SETTER_TYPES
  // [cfe] The type 'num' of the getter 'ConflictClassGetterSetterTypeStatic.foo' is not a subtype of the type 'int' of the setter 'ConflictClassGetterSetterTypeStatic.foo'.

  // Type of setter parameter must be subtype of type of getter.
  static void set foo(int _) {}
}

enum NoConflictClassEnumValueStaticSetter {
  e1;

  static void set e1(NoConflictClassEnumValueStaticSetter _) {}
}

enum ConflictClassEnumValueStaticSetterType {
  e1;
//^^
// [analyzer] COMPILE_TIME_ERROR.GETTER_NOT_SUBTYPE_SETTER_TYPES
// [cfe] The type 'ConflictClassEnumValueStaticSetterType' of the getter 'ConflictClassEnumValueStaticSetterType.e1' is not a subtype of the type 'int' of the setter 'ConflictClassEnumValueStaticSetterType.e1'.

  // Type of setter parameter must be subtype of type of getter.
  static void set e1(int _) {}
}

enum ConflictTypeParameterMember<foo> {
  //                             ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_MEMBER
  e1;
  int get foo => 42;
  //      ^
  // [cfe] Conflicts with type variable 'foo'.
}

enum ConflictTypeParameterValues<values> {
  // ^
  // [cfe] Conflicts with type variable 'values'.
  //                             ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_MEMBER
  e1;
}

enum ConflictTypeParameterEnumValue<e1> {
  //                                ^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_MEMBER
  e1;
//^
// [cfe] Conflicts with type variable 'e1'.
}

enum ConflictTypeParameters<T, T> {
  //                           ^
  // [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
  // [cfe] A type variable can't have the same name as another.
  e1;
}

enum ConflictClassTypeParameter<ConflictClassTypeParameter> {
  //                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_CONTAINER
  // [cfe] A type variable can't have the same name as its enclosing declaration.
  e1;
  //^
  // [cfe] Couldn't find constructor 'ConflictClassTypeParameter'.
}

// "If you define an instance member named $m$,
//  and your superclass has an instance member of the same name,
//  they override each other."

enum OverrideInheritedMemberOverride with MethodFoo {
  e1;
  int foo(int x) => x; // super.foo is nullary.
  //  ^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
  // [cfe] The method 'OverrideInheritedMemberOverride.foo' has more required arguments than those of overridden method '_Enum with MethodFoo.foo'.
}

enum OverrideInheritedMemberDifferentType with GetFoo {
  e1;
  int foo(int x) => x;
  //  ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_METHOD_AND_FIELD
  // [cfe] Can't declare a member that conflicts with an inherited one.
}

enum ImplementInheritedMemberDifferentType implements GetFoo {
  e1;
  int foo(int x) => x;
  //  ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_METHOD_AND_FIELD
  // [cfe] Can't declare a member that conflicts with an inherited one.
}

enum OverrideInheritedParameterTypeOverride with SetFoo {
  e1;
  void set foo(Never n) {} // Invalid parameter override.
  //       ^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
  //                 ^
  // [cfe] The parameter 'n' of the method 'OverrideInheritedParameterTypeOverride.foo' has type 'Never', which does not match the corresponding type, 'int', in the overridden method, '_Enum with SetFoo.foo'.
}

// "Setters, getters and operators never have
//  optional parameters of any kind"

enum DeclareOperatorOptional {
  e1;
  int operator+([int? x]) => x ?? 0;
  //             ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.OPTIONAL_PARAMETER_IN_OPERATOR
  //                  ^
  // [cfe] An operator can't have optional parameters.
}

enum DeclareSetterOptional {
  e1;
  void set foo([int? x]) {}
  //       ^^^
  // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
  //          ^
  // [cfe] A setter should have exactly one formal parameter.
}

// "The identifier of a named constructor cannot be the same as
//  the basename of a static member declared in the same class"

enum ConflictConstructorNameStatic {
  e1.foo();
  const ConflictConstructorNameStatic.foo();
  //    ^
  // [cfe] Conflicts with member 'foo'.
  //                                  ^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER
  static int get foo => 42;
  //             ^
  // [cfe] Conflicts with constructor 'ConflictConstructorNameStatic.foo'.
}

enum ConflictConstructorNameStaticEnumValue {
  e1.e1();
//^
// [cfe] Conflicts with constructor 'ConflictConstructorNameStaticEnumValue.e1'.
  const ConflictConstructorNameStaticEnumValue.e1();
  //    ^
  // [cfe] Conflicts with member 'e1'.
  //                                           ^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER
}

// "It is an error if a member has the same name as its enclosing class"

enum ConflictClassStatic {
  e1;
//^
// [cfe] Cannot invoke a non-'const' constructor where a const expression is expected.
  static int ConflictClassStatic() => 37;
//^^^^^^
// [analyzer] SYNTACTIC_ERROR.STATIC_CONSTRUCTOR
// [cfe] Constructors can't be static.
//       ^^^
// [analyzer] SYNTACTIC_ERROR.CONSTRUCTOR_WITH_RETURN_TYPE
// [cfe] Constructors can't have a return type.
//           ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_CONST_GENERATIVE_ENUM_CONSTRUCTOR
// [cfe] Generative enum constructors must be marked as 'const'.
//                                 ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.RETURN_IN_GENERATIVE_CONSTRUCTOR
//                                    ^^
// [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] Constructors can't have a return type.
}

enum ConflictClassInstance {
  e1;
//^
// [cfe] Cannot invoke a non-'const' constructor where a const expression is expected.
  int ConflictClassInstance() => 37;
//^^^
// [analyzer] SYNTACTIC_ERROR.CONSTRUCTOR_WITH_RETURN_TYPE
// [cfe] Constructors can't have a return type.
//    ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_CONST_GENERATIVE_ENUM_CONSTRUCTOR
// [cfe] Generative enum constructors must be marked as 'const'.
//                            ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.RETURN_IN_GENERATIVE_CONSTRUCTOR
//                               ^^
// [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] Constructors can't have a return type.
}

enum ConflictClassEnumValue {
  ConflictClassEnumValue;
//^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING
// [cfe] Name of enum constant 'ConflictClassEnumValue' can't be the same as the enum's own name.
//                      ^
// [cfe] Couldn't find constructor 'ConflictClassEnumValue'.
}

// Has conflict with implicitly inserted `values` member.
enum values {
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] The name 'values' is not a valid name for an enum. Try using a different name.
  e1;
  //^
  // [cfe] Couldn't find constructor 'values'.
}

// "It is an error if a concrete class does not implement some member
//  of its interface, and there is no non-trivial \code{noSuchMethod}"

enum UnimplementedInterface {
  e1;
  int foo();
//^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ENUM_WITH_ABSTRACT_MEMBER
//    ^
// [cfe] Enums can't declare abstract members.
}

enum UnimplementedInterfaceInherited implements MethodFoo {
  // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER
  // [cfe] The non-abstract class 'UnimplementedInterfaceInherited' is missing implementations for these members:
  e1;
}

enum ImplementedInterface with MethodFoo {
  e1;
  int foo(); // Abstract members are allowed.
}

enum ImplementedInterfaceNSM {
  e1;
  int foo(); // Abstract members are allowed.
  dynamic noSuchMethod(i) => 42;
}

// Primitive Equality/HashCode.
// Enums must not override `==` or `hashCode`.

enum OverridesEquals {
  e1;

  bool operator==(Object other) => identical(e1, other);
  //   ^^^^^^^^
  // [analyzer] unspecified
  //           ^
  // [cfe] An enum can't declare a non-abstract member named '=='.
}

enum OverridesHashCode {
  e1;

  int get hashCode => 42;
  //      ^^^^^^^^
  // [analyzer] unspecified
  // [cfe] An enum can't declare a non-abstract member named 'hashCode'.
}

// Invalid syntax that the compiled *should* recover from.
abstract enum CannotBeAbstract {
// [error column 1, length 8]
// [analyzer] SYNTACTIC_ERROR.EXTRANEOUS_MODIFIER
// [cfe] Can't have modifier 'abstract' here.
  e1;
}

// Cannot reference generative constructors of enum classes.
// Never allowed to reference by ClassName[.name],
// only implicitly in value declarations and `this`[.name] in
// redirecting generative constructors.
// All ClassName[.name] references are errors.
enum NoConstructorCalls {
  e1(42),
  e2.ignore(NoConstructorCalls(1)),
  //        ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
  // [cfe] Enums can't be instantiated.
  ;

  final int x;

  const NoConstructorCalls(this.x);
  const NoConstructorCalls.ignore(dynamic _) : x = 0;

  // Only valid use, as target of redirecting generative constructor.
  const NoConstructorCalls.redirect() : this(1);
  const NoConstructorCalls.redirectNamed() : this.ignore(0);

  const NoConstructorCalls.invalidRedirect()
       : this.ignore(NoConstructorCalls(1));
  //                 ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
  //                 ^^^^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CONSTANT
  // [cfe] Enums can't be instantiated.

  // Generative constructors must be const.
  NoConstructorCalls.notConst(this.x);
//^^^^^^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_CONST_GENERATIVE_ENUM_CONSTRUCTOR
// [cfe] Generative enum constructors must be marked as 'const'.

  // As usual, redirecting generative constructors must redirect to
  // generative constructors.
  const NoConstructorCalls.badRedirect() : this.factory();
  //    ^
  // [cfe] Final field 'x' is not initialized by this constructor.
  //                                       ^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR
  // [cfe] Couldn't find constructor 'NoConstructorCalls.factory'.
  //                                            ^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_NON_CONST_CONSTRUCTOR

  factory NoConstructorCalls.factory() => e1; // Valid.

  // Cannot reference generative constructors from factory constructors.
  factory NoConstructorCalls.badFactory() => NoConstructorCalls(2);
  //                                         ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
  // [cfe] Enums can't be instantiated.

  factory NoConstructorCalls.badFactoryRedirect(int x) = NoConstructorCalls;
  //                                                     ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
  // [cfe] Enum factory constructors can't redirect to generative constructors.

  static const NoConstructorCalls e3 = NoConstructorCalls(3);
  //                                   ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
  // [cfe] Enums can't be instantiated.

  static void uses() {
    Function f = NoConstructorCalls.new; // No tearoffs.
    //           ^^^^^^^^^^^^^^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
    //                              ^
    // [cfe] Enum constructors can't be torn off.

    Function g = NoConstructorCalls.ignore; // No tearoffs.
    //           ^^^^^^^^^^^^^^^^^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
    //                              ^
    // [cfe] Enum constructors can't be torn off.

    const c1 = NoConstructorCalls(0);
    //         ^^^^^^^^^^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
    // [cfe] Enums can't be instantiated.

    var v1 = new NoConstructorCalls(0);
    //           ^^^^^^^^^^^^^^^^^^
    // [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_GENERATIVE_ENUM_CONSTRUCTOR
    // [cfe] Enums can't be instantiated.
  }
}

enum DeclaresInstanceValues {
  e1;
  int get values => 42;
  //      ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
  // [cfe] An enum can't declare a member named 'values'.
}

enum DeclaresStaticValues {
  e1;
  static int get values => 42;
  //             ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
  // [cfe] An enum can't declare a member named 'values'.
}

enum InheritsValues with ValuesGetter {
  // ^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ENUM_VALUES
  // [cfe] An enum can't inherit a member named 'values'.
  // [cfe] Can't declare a member that conflicts with an inherited one.
  e1;
}

enum ImplementsValues implements ValuesGetter {
  // ^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ENUM_VALUES
  // [cfe] Can't declare a member that conflicts with an inherited one.
  e1;

  noSuchMethod(i) => 42;
}

enum DeclaresInstanceIndex {
  e1;
  int get index => 42;
  //      ^^^^^
  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER
  // [cfe] An enum can't declare a non-abstract member named 'index'.
}

enum DeclaresStaticIndex {
  e1;
  static int get index => 42; // Conflicts with inherited instance member.
  //             ^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_STATIC_AND_INSTANCE
  // [cfe] An enum can't declare a non-abstract member named 'index'.
  // [cfe] Can't declare a member that conflicts with an inherited one.
}

enum InheritsIndex with IndexGetter {
  // ^^^^^^^^^^^^^
  // [analyzer] unspecified
  // [cfe] An enum can't inherit a member named 'index'.
  e1;
}

// No problem, implementation is not overridden.
enum ImplementsIndex implements IndexGetter {
  e1;
}

enum DeclaresNeverIndex {
  // ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_IMPLEMENTATION_OVERRIDE
  // [cfe] The implementation of 'index' in the non-abstract class 'DeclaresNeverIndex' does not conform to its interface.
  e1;

  Never get index;
}

enum ImplementsNeverIndex {
  e1;

  Never get index => throw "Never!";
  //        ^^^^^
  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_CONCRETE_ENUM_MEMBER
  // [cfe] An enum can't declare a non-abstract member named 'index'.
}

enum NSMImplementsNeverIndex implements NeverIndexGetter {
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] The implementation of 'index' in the non-abstract class 'NSMImplementsNeverIndex' does not conform to its interface.
  e1;

  noSuchMethod(i) => throw "Never!";
}

// Cannot have cyclic references between constants.
enum CyclicReference {
//   ^
// [cfe] Constant evaluation error:
  e1(e2),
//^^
// [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
// [cfe] Can't infer the type of 'e1': circularity found during type inference.
// [cfe] Constant evaluation error:
  e2(e1);
//^^
// [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
  final CyclicReference other;
  const CyclicReference(this.other);
}

// Since `values` contains `e1`,
// we can't have a reference in the other direction.
enum CyclicReferenceValues {
//   ^
// [cfe] Constant evaluation error:
  e1(values);
//^^
// [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
  final List<CyclicReferenceValues> list;
  const CyclicReferenceValues(this.list);
}

void main() {}
