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

import "package:expect/expect.dart";

abstract class A<T extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::A::•]/*isLegacy*/;
  constructor empty() → self::A<self::A::T%>
    ;
  static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%>
    return self::B::•<self::A::•::T%, core::List<self::A::•::T%>>();
}
abstract class B<U extends core::Object? = dynamic, W extends core::Object? = dynamic> extends self::A<self::B::U%> {
  static final field dynamic _redirecting# = <dynamic>[self::B::•]/*isLegacy*/;
  constructor empty() → self::B<self::B::U%, self::B::W%>
    ;
  static factory •<U extends core::Object? = dynamic, W extends core::Object? = dynamic>() → self::B<self::B::•::U%, self::B::•::W%>
    return new self::C::•<self::B::•::U%, self::B::•::W%, core::Map<self::B::•::U%, self::B::•::W%>>();
}
class C<V extends core::Object? = dynamic, S extends core::Object? = dynamic, R extends core::Object? = dynamic> extends self::B<self::C::V%, self::C::S%> {
  constructor •() → self::C<self::C::V%, self::C::S%, self::C::R%>
    ;
  method toString() → core::String
    ;
}
static method main() → dynamic
  ;


Extra constant evaluation status:
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirection_chain_type_arguments_subst.dart:11:16 -> ConstructorTearOffConstant(A.)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///redirection_chain_type_arguments_subst.dart:16:16 -> ConstructorTearOffConstant(B.)
Extra constant evaluation: evaluated: 6, effectively constant: 2
