library;
import self as self;

import "org-dartlang-testcase:///opt_in_lib.dart";

static method main() → dynamic
  ;

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

class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class1::redirect, self2::Class1::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class1<self2::Class1::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object?>() → self2::Class1<self2::Class1::redirect::T%>
    return new self2::Class1::_<self2::Class1::redirect::T%>();
  static factory constRedirect<T extends core::Object?>() → self2::Class1<self2::Class1::constRedirect::T%>
    return new self2::Class1::_<self2::Class1::constRedirect::T%>();
  static factory fact<T extends core::Object?>() → self2::Class1<self2::Class1::fact::T%>
    ;
}
class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class2::redirect, self2::Class2::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class2<self2::Class2::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object>() → self2::Class2<self2::Class2::redirect::T>
    return new self2::Class2::_<self2::Class2::redirect::T>();
  static factory constRedirect<T extends core::Object>() → self2::Class2<self2::Class2::constRedirect::T>
    return new self2::Class2::_<self2::Class2::constRedirect::T>();
  static factory fact<T extends core::Object>() → self2::Class2<self2::Class2::fact::T>
    ;
}
class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class3::redirect, self2::Class3::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class3<self2::Class3::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::String>() → self2::Class3<self2::Class3::redirect::T>
    return new self2::Class3::_<self2::Class3::redirect::T>();
  static factory constRedirect<T extends core::String>() → self2::Class3<self2::Class3::constRedirect::T>
    return new self2::Class3::_<self2::Class3::constRedirect::T>();
  static factory fact<T extends core::String>() → self2::Class3<self2::Class3::fact::T>
    ;
}
class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class4::redirect, self2::Class4::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class4<self2::Class4::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::redirect::T%>
    return new self2::Class4::_<self2::Class4::redirect::T%>();
  static factory constRedirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::constRedirect::T%>
    return new self2::Class4::_<self2::Class4::constRedirect::T%>();
  static factory fact<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::fact::T%>
    ;
}
class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class5::redirect, self2::Class5::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class5<self2::Class5::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends dynamic>() → self2::Class5<self2::Class5::redirect::T%>
    return new self2::Class5::_<self2::Class5::redirect::T%>();
  static factory constRedirect<T extends dynamic>() → self2::Class5<self2::Class5::constRedirect::T%>
    return new self2::Class5::_<self2::Class5::constRedirect::T%>();
  static factory fact<T extends dynamic>() → self2::Class5<self2::Class5::fact::T%>
    ;
}
static method testOptIn() → dynamic
  ;


Extra constant evaluation status:
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:5:7 -> ConstructorTearOffConstant(Class1.redirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:5:7 -> ConstructorTearOffConstant(Class1.constRedirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:13:7 -> ConstructorTearOffConstant(Class2.redirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:13:7 -> ConstructorTearOffConstant(Class2.constRedirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:21:7 -> ConstructorTearOffConstant(Class3.redirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:21:7 -> ConstructorTearOffConstant(Class3.constRedirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:29:7 -> ConstructorTearOffConstant(Class4.redirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:29:7 -> ConstructorTearOffConstant(Class4.constRedirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:37:7 -> ConstructorTearOffConstant(Class5.redirect)
Evaluated: ConstructorTearOff @ org-dartlang-testcase:///opt_in_lib.dart:37:7 -> ConstructorTearOffConstant(Class5.constRedirect)
Extra constant evaluation: evaluated: 25, effectively constant: 10
