// Unhandled errors:
//
// pkg/front_end/testcases/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
//  - 'Foo' is from 'pkg/front_end/testcases/redirecting_factory.dart'.
//  - 'FooBase' is from 'pkg/front_end/testcases/redirecting_factory.dart'.
//   factory FooBase(int x) = Foo<Tf>;
//                            ^

library;
import self as self;
import "dart:core" as core;

abstract class FooBase<Tf extends core::Object = dynamic> extends core::Object {
  static field dynamic _redirecting# = <dynamic>[self::FooBase::•];
  abstract get x() → core::int;
  static factory •<Tf extends core::Object = dynamic>(core::int x) → self::FooBase<self::FooBase::•::Tf>
    let <T extends core::Object = dynamic>(core::int) → self::Foo<self::Foo::•::T> #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf #typeArg0 = null in invalid-expression;
}
abstract class Foo<T extends core::Object = dynamic> extends core::Object implements self::FooBase<dynamic> {
  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
  static factory •<T extends core::Object = dynamic>(core::int x) → self::Foo<self::Foo::•::T>
    let<BottomType> #redirecting_factory = self::Bar::• in let core::String #typeArg0 = null in let self::Foo::•::T #typeArg1 = null in invalid-expression;
}
class Bar<Sb extends core::Object = dynamic, Tb extends core::Object = dynamic> extends core::Object implements self::Foo<self::Bar::Tb> {
  field core::int x;
  constructor •(core::int x) → self::Bar<self::Bar::Sb, self::Bar::Tb>
    : self::Bar::x = x, super core::Object::•() {
    core::print("Bar<${self::Bar::Sb},${self::Bar::Tb}>");
  }
}
class Builder<X extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::Builder<self::Builder::X>
    : super core::Object::•()
    ;
  method method() → dynamic {
    return new self::Bar::•<core::String, self::Builder::X>(4);
  }
}
class SimpleCase<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
    let <Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi> #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A #typeArg0 = null in let self::SimpleCase::•::B #typeArg1 = null in invalid-expression;
}
class SimpleCaseImpl<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai, self::SimpleCaseImpl::Bi> {
  static field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
  static factory •<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
    let<BottomType> #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai #typeArg0 = null in let self::SimpleCaseImpl::•::Bi #typeArg1 = null in invalid-expression;
}
class SimpleCaseImpl2<Ai2 extends core::Object = dynamic, Bi2 extends core::Object = dynamic> extends core::Object implements self::SimpleCaseImpl<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2> {
  synthetic constructor •() → self::SimpleCaseImpl2<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2>
    : super core::Object::•()
    ;
}
class Base<M extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::Base<self::Base::M>
    : super core::Object::•()
    ;
}
class Mixin<M extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::Mixin<self::Mixin::M>
    : super core::Object::•()
    ;
}
class Mix<M extends core::Object = dynamic> extends self::Base<self::Mix::M> implements self::Mixin<self::Mix::M> {
  synthetic constructor •() → self::Mix<self::Mix::M>
    : super self::Base::•()
    ;
}
static method main() → dynamic {
  core::print(new self::Bar::•<core::String, core::double>(4).{self::FooBase::x});
  new self::SimpleCaseImpl2::•<core::int, core::double>();
  new self::Mix::•<core::double>();
}
