library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

typedef G<invariant X extends core::Object? = dynamic> = (X%) → X%;
typedef A<X extends (self::C<X>) → self::C<X> = (self::C<dynamic>) → self::C<dynamic>> = self::C<X>;
typedef B<X extends (self::D<X>) → self::D<X> = (self::D<dynamic>) → self::D<dynamic>> = self::D<X>;
class C<X extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::C::bar]/*isLegacy*/;
  constructor foo() → self::C<self::C::X%>
    ;
  static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
    ;
  static factory bar<X extends core::Object? = dynamic>() → self::C<self::C::bar::X%>
    return self::C::•<self::C::bar::X%>();
}
class D<X extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::D::bar]/*isLegacy*/;
  constructor •() → self::D<self::D::X%>
    ;
  static factory foo<X extends core::Object? = dynamic>() → self::D<self::D::foo::X%>
    ;
  static factory bar<X extends core::Object? = dynamic>() → self::D<self::D::bar::X%>
    return new self::D::•<self::D::bar::X%>();
}
static method test() → dynamic
  ;
static method main() → dynamic
  ;
static method _#A#new#tearOff<X extends (self::C<self::_#A#new#tearOff::X>) → self::C<self::_#A#new#tearOff::X> = (self::C<dynamic>) → self::C<dynamic>>() → self::C<self::_#A#new#tearOff::X>
  return self::C::•<self::_#A#new#tearOff::X>();
static method _#A#foo#tearOff<X extends (self::C<self::_#A#foo#tearOff::X>) → self::C<self::_#A#foo#tearOff::X> = (self::C<dynamic>) → self::C<dynamic>>() → self::C<self::_#A#foo#tearOff::X>
  return new self::C::foo<self::_#A#foo#tearOff::X>();
static method _#A#bar#tearOff<X extends (self::C<self::_#A#bar#tearOff::X>) → self::C<self::_#A#bar#tearOff::X> = (self::C<dynamic>) → self::C<dynamic>>() → self::C<self::_#A#bar#tearOff::X>
  return self::C::bar<self::_#A#bar#tearOff::X>();
static method _#B#new#tearOff<X extends (self::D<self::_#B#new#tearOff::X>) → self::D<self::_#B#new#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#new#tearOff::X>
  return new self::D::•<self::_#B#new#tearOff::X>();
static method _#B#foo#tearOff<X extends (self::D<self::_#B#foo#tearOff::X>) → self::D<self::_#B#foo#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#foo#tearOff::X>
  return self::D::foo<self::_#B#foo#tearOff::X>();
static method _#B#bar#tearOff<X extends (self::D<self::_#B#bar#tearOff::X>) → self::D<self::_#B#bar#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#bar#tearOff::X>
  return self::D::bar<self::_#B#bar#tearOff::X>();


Extra constant evaluation status:
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue45519_2.dart:5:7 -> ConstructorTearOffConstant(C.bar)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///issue45519_2.dart:10:7 -> ConstructorTearOffConstant(D.bar)
Extra constant evaluation: evaluated: 12, effectively constant: 2
