library;
//
// Problems in library:
//
// pkg/front_end/testcases/extension_types/redirecting_factory_from_enum.dart:7:35: Error: The constructor function type 'E1 Function(A1)' isn't a subtype of 'A1 Function(A1)'.
//  - 'A1' is from 'pkg/front_end/testcases/extension_types/redirecting_factory_from_enum.dart'.
//   const factory A1.named(A1 it) = E1.named; // Error.
//                                   ^
//
// pkg/front_end/testcases/extension_types/redirecting_factory_from_enum.dart:17:35: Error: The constructor function type 'E2 Function(A2)' isn't a subtype of 'A2 Function(A2)'.
//  - 'A2' is from 'pkg/front_end/testcases/extension_types/redirecting_factory_from_enum.dart'.
//   const factory A2.named(A2 it) = E2.named; // Error.
//                                   ^
//
import self as self;
import "dart:core" as core;

class A1 extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::A1
    : super core::Object::•()
    ;
  static factory named(self::A1 it) → self::A1
    return invalid-expression "pkg/front_end/testcases/extension_types/redirecting_factory_from_enum.dart:7:35: Error: The constructor function type 'E1 Function(A1)' isn't a subtype of 'A1 Function(A1)'.
 - 'A1' is from 'pkg/front_end/testcases/extension_types/redirecting_factory_from_enum.dart'.
  const factory A1.named(A1 it) = E1.named; // Error.
                                  ^";
}
class A2 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::A2> values = const <self::A2>[self::A2::element];
  enum-element static const field self::A2 element = const self::A2::•(0, "element");
  const constructor •(core::int #index, core::String #name) → self::A2
    : super core::_Enum::•(#index, #name)
    ;
  method _enumToString() → core::String
    return "A2.${this.{core::_Enum::_name}{core::String}}";
  static factory named(self::A2 it) → self::A2
    return invalid-expression "pkg/front_end/testcases/extension_types/redirecting_factory_from_enum.dart:17:35: Error: The constructor function type 'E2 Function(A2)' isn't a subtype of 'A2 Function(A2)'.
 - 'A2' is from 'pkg/front_end/testcases/extension_types/redirecting_factory_from_enum.dart'.
  const factory A2.named(A2 it) = E2.named; // Error.
                                  ^";
}
extension type E1(self::A1 it) {
  abstract extension-type-member representation-field get it() → self::A1;
  constructor • = self::E1|constructor#;
  constructor tearoff • = self::E1|constructor#_#new#tearOff;
  constructor named = self::E1|constructor#named;
  constructor tearoff named = self::E1|constructor#_#named#tearOff;
}
extension type E2(self::A2 it) {
  abstract extension-type-member representation-field get it() → self::A2;
  constructor • = self::E2|constructor#;
  constructor tearoff • = self::E2|constructor#_#new#tearOff;
  constructor named = self::E2|constructor#named;
  constructor tearoff named = self::E2|constructor#_#named#tearOff;
}
static extension-type-member method E1|constructor#(self::A1 it) → self::E1% /* erasure=self::A1, declared=! */ {
  lowered final self::E1% /* erasure=self::A1, declared=! */ #this = it;
  return #this;
}
static extension-type-member method E1|constructor#_#new#tearOff(self::A1 it) → self::E1% /* erasure=self::A1, declared=! */
  return self::E1|constructor#(it);
static extension-type-member method E1|constructor#named(self::A1 it) → self::E1% /* erasure=self::A1, declared=! */ {
  lowered final self::E1% /* erasure=self::A1, declared=! */ #this;
  #this = self::E1|constructor#(it);
  return #this;
}
static extension-type-member method E1|constructor#_#named#tearOff(self::A1 it) → self::E1% /* erasure=self::A1, declared=! */
  return self::E1|constructor#named(it);
static extension-type-member method E2|constructor#(self::A2 it) → self::E2% /* erasure=self::A2, declared=! */ {
  lowered final self::E2% /* erasure=self::A2, declared=! */ #this = it;
  return #this;
}
static extension-type-member method E2|constructor#_#new#tearOff(self::A2 it) → self::E2% /* erasure=self::A2, declared=! */
  return self::E2|constructor#(it);
static extension-type-member method E2|constructor#named(self::A2 it) → self::E2% /* erasure=self::A2, declared=! */ {
  lowered final self::E2% /* erasure=self::A2, declared=! */ #this;
  #this = self::E2|constructor#(it);
  return #this;
}
static extension-type-member method E2|constructor#_#named#tearOff(self::A2 it) → self::E2% /* erasure=self::A2, declared=! */
  return self::E2|constructor#named(it);


Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///redirecting_factory_from_enum.dart:14:6 -> ListConstant(const <A2>[const A2{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_factory_from_enum.dart:15:3 -> InstanceConstant(const A2{_Enum.index: 0, _Enum._name: "element"})
Extra constant evaluation: evaluated: 27, effectively constant: 2
