library;
//
// Problems in library:
//
// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Couldn't find constructor 'Missing'.
//   factory A.c() = Missing;
//                   ^
//
// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
//   factory A.c() = Missing;
//                   ^
//
// pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
//  - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
//  - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
//   factory A.b() = B<C1>.a;
//                   ^
//
// pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
//  - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
//  - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
//   factory B.b() = C<C2>;
//                   ^
//
import self as self;
import "dart:core" as core;

class C1 extends core::Object {
  synthetic constructor •() → self::C1*
    ;
}
class C2 extends core::Object {
  synthetic constructor •() → self::C2*
    ;
}
class C3 extends core::Object {
  synthetic constructor •() → self::C3*
    ;
}
class A<T extends core::Object* = dynamic> extends core::Object {
  static field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
  constructor internal() → self::A<self::A::T*>*
    ;
  static factory a<T extends core::Object* = dynamic>() → self::A<self::A::a::T*>*
    let dynamic #redirecting_factory = self::B::a in let self::A::a::T* #typeArg0 = null in invalid-expression;
  static factory b<T extends core::Object* = dynamic>() → self::A<self::A::b::T*>*
    let dynamic #redirecting_factory = self::B::a in let self::C1* #typeArg0 = null in invalid-expression;
  static factory c<T extends core::Object* = dynamic>() → self::A<self::A::c::T*>*
    let dynamic #redirecting_factory = "Missing" in invalid-expression;
}
class B<S extends core::Object* = dynamic> extends self::A<self::B::S*> {
  static field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
  constructor internal() → self::B<self::B::S*>*
    ;
  static factory a<S extends core::Object* = dynamic>() → self::B<self::B::a::S*>*
    let dynamic #redirecting_factory = self::C::• in let self::B::a::S* #typeArg0 = null in invalid-expression;
  static factory b<S extends core::Object* = dynamic>() → self::B<self::B::b::S*>*
    let dynamic #redirecting_factory = self::C::• in let self::C2* #typeArg0 = null in invalid-expression;
}
class C<U extends core::Object* = dynamic> extends self::B<self::C::U*> {
  constructor •() → self::C<self::C::U*>*
    ;
}
static method main() → dynamic
  ;
