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

class _X<T extends core::Object? = dynamic> extends core::Object {
  static factory •<T extends core::Object? = dynamic>() → self::_X<self::_X::•::T%> /* redirection-target: self::_Y::•<self::_X::•::T%>*/
    return new self::_Y::•<self::_X::•::T%>();
}
class _Y<T extends core::Object? = dynamic> extends core::Object implements self::_X<self::_Y::T%> /*hasConstConstructor*/  {
  const constructor •() → self::_Y<self::_Y::T%>
    : super core::Object::•()
    ;
}
class A<T extends core::Object? = dynamic> extends core::Object {
  covariant-by-class field self::_X<self::A::T%> x;
  constructor •(self::_X<self::A::T%> x) → self::A<self::A::T%>
    : self::A::x = x, super core::Object::•()
    ;
}
class B<T extends core::Object? = dynamic> extends self::A<self::B::T%> {
  constructor •() → self::B<self::B::T%>
    : super self::A::•(#C1)
    ;
}
static method main() → dynamic {
  dynamic x = new self::B::•<dynamic>().{self::A::x}{self::_X<dynamic>};
  if(!(x is self::_Y<Null>)) {
    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}{<object>}.{core::Type}}, but `_Y<Null>` expected";
  }
}

constants  {
  #C1 = self::_Y<Never> {}
}


Constructor coverage from constants:
org-dartlang-testcase:///redirecting_factory_const_inference.dart:
- _Y. (from org-dartlang-testcase:///redirecting_factory_const_inference.dart:14:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
