library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'Y Function(Y)' of the type variable 'Y' on 'E1'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// enum E1<Y extends A<Y>> /* Error */ {
//      ^
// pkg/front_end/testcases/general/bounds_enums.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
// enum E1<Y extends A<Y>> /* Error */ {
//         ^
// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Context: If you want 'E1<A<dynamic>>' to be a super-bounded type, note that the inverted type 'E1<A<Never>>' must then satisfy its bounds, which it does not.
//  - 'E1' is from 'pkg/front_end/testcases/general/bounds_enums.dart'.
// enum E1<Y extends A<Y>> /* Error */ {
//      ^
//
import self as self;
import "dart:core" as core;

typedef A<invariant X extends core::Object? = dynamic> = (X%) → X%;
class B<X extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::X%>
    ;
}
class E1<Y extends (self::E1::Y) → self::E1::Y = (dynamic) → dynamic> extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E1<(dynamic) → dynamic>> values = const <self::E1<dynamic>>[self::E1::e1];
  static const field self::E1<Never> e1 = const self::E1::•<Never>(0, "e1");
  const constructor •(core::int #index, core::String #name) → self::E1<self::E1::Y>
    : super core::_Enum::•(#index, #name)
    ;
  method toString() → core::String
    return "E1.${this.{core::_Enum::_name}{core::String}}";
}
class E2<Y extends self::B<self::E2::Y> = self::B<dynamic>> extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E2<self::B<dynamic>>> values = const <self::E2<dynamic>>[self::E2::e2];
  static const field self::E2<Never> e2 = const self::E2::•<Never>(0, "e2");
  const constructor •(core::int #index, core::String #name) → self::E2<self::E2::Y>
    : super core::_Enum::•(#index, #name)
    ;
  method toString() → core::String
    return "E2.${this.{core::_Enum::_name}{core::String}}";
}
class E3<Y extends self::E3<self::E3::Y> = self::E3<dynamic>> extends core::_Enum /*isEnum*/  {
  static const field core::List<self::E3<self::E3<dynamic>>> values = const <self::E3<dynamic>>[self::E3::e3];
  static const field self::E3<Never> e3 = const self::E3::•<Never>(0, "e3");
  const constructor •(core::int #index, core::String #name) → self::E3<self::E3::Y>
    : super core::_Enum::•(#index, #name)
    ;
  method toString() → core::String
    return "E3.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_enums.dart:11:6 -> ListConstant(const <E1<dynamic>*>[const E1<Never*>{_Enum.index: 0, _Enum._name: "e1"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_enums.dart:12:3 -> InstanceConstant(const E1<Never*>{_Enum.index: 0, _Enum._name: "e1"})
Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_enums.dart:15:6 -> ListConstant(const <E2<dynamic>*>[const E2<Never*>{_Enum.index: 0, _Enum._name: "e2"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_enums.dart:16:3 -> InstanceConstant(const E2<Never*>{_Enum.index: 0, _Enum._name: "e2"})
Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_enums.dart:19:6 -> ListConstant(const <E3<dynamic>*>[const E3<Never*>{_Enum.index: 0, _Enum._name: "e3"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_enums.dart:20:3 -> InstanceConstant(const E3<Never*>{_Enum.index: 0, _Enum._name: "e3"})
Extra constant evaluation: evaluated: 21, effectively constant: 6
