// Formatted problems:
//
// pkg/front_end/testcases/redirecting_factory.dart:7:28: Error: The return type '#lib1::Foo<#lib1::FooBase::•::Tf>' of the constructor 'Foo' isn't a subtype of '#lib1::FooBase<#lib1::FooBase::•::Tf>'.
// Try redirecting to a different constructor.
//   factory FooBase(int x) = Foo<Tf>;
//                            ^

// Unhandled errors:
//
// pkg/front_end/testcases/redirecting_factory.dart:7:28: Error: The return type '#lib1::Foo<#lib1::FooBase::•::Tf>' of the constructor 'Foo' isn't a subtype of '#lib1::FooBase<#lib1::FooBase::•::Tf>'.
// Try redirecting to a different constructor.
//   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 dynamic #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 dynamic #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 dynamic #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 dynamic #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> = self::Base<self::Mix::M> with 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>();
}
