// 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.

// SharedOptions=--enable-experiment=enhanced-enums

// 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;
  //  ^^^
  // [cfe] unspecified
}

enum ConflictStaticInstanceProperty2 {
  e1;
  int get foo => 42;
  //      ^^^
  // [cfe] unspecified
  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 _) {}
  //       ^^^
  // [cfe] unspecified
}


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,
//^^
// [cfe] unspecified
  e1,
//^^
// [analyzer] COMPILE_TIME_ERROR.DUPLICATE_DEFINITION
// [cfe] 'e1' is already declared in this scope.
  ;
}

enum ConflictStaticEnumValuesLooksDifferent {
  e1(),
//^^
// [cfe] unspecified
  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] Enums can't contain declarations of members with the name '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] unspecified
}

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> {
  //                             ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_MEMBER
  // [cfe] unspecified
  e1;
}

enum ConflictTypeParameterEnumValue<e1> {
  //                                ^^
  // [analyzer] COMPILE_TIME_ERROR.CONFLICTING_TYPE_VARIABLE_AND_MEMBER
  // [cfe] unspecified
  e1;
//^^
// [cfe] unspecified
}

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;
}

// "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] unspecified
}

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] unspecified
  static int get foo => 42;
  //             ^^^
  // [analyzer] unspecified
  // [cfe] Conflicts with constructor 'ConflictConstructorNameStatic.foo'.
}

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

// "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.
}

// Has conflict with implicitly inserted `values` member.
enum values {
  // ^^^^^^
  // [analyzer] unspecified
  // [cfe] unspecified
  e1;
}

// "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 {
  // ^^^^^^^^^^^^^^^^^^^^^^
  // [cfe] The non-abstract class 'UnimplementedInterface' is missing implementations for these members:
  e1;
  int foo();
//^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ENUM_WITH_ABSTRACT_MEMBER
}

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] unspecified
}

enum OverridesHashCode {
  e1;

  int get hashCode => 42;
  //      ^^^^^^^^
  // [cfe] unspecified
  // [analyzer] unspecified
}

// 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] Enums can't contain declarations of members with the name 'values'.
}

enum DeclaresStaticValues {
  e1;
  static int get values => 42;
  //             ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.VALUES_DECLARATION_IN_ENUM
  // [cfe] Enums can't contain declarations of members with the name 'values'.
}

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

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

  noSuchMethod(i) => 42;
}

enum DeclaresInstanceIndex {
  e1;
  int get index => 42;
  //      ^^^^^
  // [analyzer] COMPILE_TIME_ERROR.ILLEGAL_NON_ABSTRACT_ENUM_INDEX
  // [cfe] unspecified
}

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

enum InheritsIndex with IndexGetter {
  // ^^^^^^^^^^^^^
  // [analyzer] unspecified
  // [cfe] unspecified
  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_NON_ABSTRACT_ENUM_INDEX
  // [cfe] unspecified
}

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),
//^
// [cfe] Constant evaluation error:
//   ^^
// [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
  e2(e1);
  // ^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
  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.CONST_WITH_NON_CONSTANT_ARGUMENT
  final List<CyclicReferenceValues> list;
  const CyclicReferenceValues(this.list);
}

void main() {}
