library;
import self as self;
import "opt_in_lib.dart" as opt;
import "dart:core" as core;

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

static method main() → dynamic {
  new opt::Class1::_<core::Object*>();
  new opt::Class1::_<core::Object*>();
  #C1;
  opt::Class1::fact<core::Object*>();
  new opt::Class2::_<core::Object*>();
  new opt::Class2::_<core::Object*>();
  #C2;
  opt::Class2::fact<core::Object*>();
  new opt::Class3::_<core::String*>();
  new opt::Class3::_<core::String*>();
  #C3;
  opt::Class3::fact<core::String*>();
  new opt::Class4::_<dynamic>();
  new opt::Class4::_<dynamic>();
  #C4;
  opt::Class4::fact<dynamic>();
  new opt::Class5::_<dynamic>();
  new opt::Class5::_<dynamic>();
  #C5;
  opt::Class5::fact<dynamic>();
  opt::testOptIn();
}

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

class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[#C6, #C7]/*isLegacy*/;
  const constructor _() → opt::Class1<opt::Class1::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
    return new opt::Class1::_<opt::Class1::redirect::T%>();
  static factory constRedirect<T extends core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
    return new opt::Class1::_<opt::Class1::constRedirect::T%>();
  static factory fact<T extends core::Object?>() → opt::Class1<opt::Class1::fact::T%>
    return new opt::Class1::_<opt::Class1::fact::T%>();
}
class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[#C8, #C9]/*isLegacy*/;
  const constructor _() → opt::Class2<opt::Class2::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object>() → opt::Class2<opt::Class2::redirect::T>
    return new opt::Class2::_<opt::Class2::redirect::T>();
  static factory constRedirect<T extends core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
    return new opt::Class2::_<opt::Class2::constRedirect::T>();
  static factory fact<T extends core::Object>() → opt::Class2<opt::Class2::fact::T>
    return new opt::Class2::_<opt::Class2::fact::T>();
}
class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[#C10, #C11]/*isLegacy*/;
  const constructor _() → opt::Class3<opt::Class3::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::String>() → opt::Class3<opt::Class3::redirect::T>
    return new opt::Class3::_<opt::Class3::redirect::T>();
  static factory constRedirect<T extends core::String>() → opt::Class3<opt::Class3::constRedirect::T>
    return new opt::Class3::_<opt::Class3::constRedirect::T>();
  static factory fact<T extends core::String>() → opt::Class3<opt::Class3::fact::T>
    return new opt::Class3::_<opt::Class3::fact::T>();
}
class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[#C12, #C13]/*isLegacy*/;
  const constructor _() → opt::Class4<opt::Class4::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::redirect::T%>
    return new opt::Class4::_<opt::Class4::redirect::T%>();
  static factory constRedirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::constRedirect::T%>
    return new opt::Class4::_<opt::Class4::constRedirect::T%>();
  static factory fact<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::fact::T%>
    return new opt::Class4::_<opt::Class4::fact::T%>();
}
class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[#C14, #C15]/*isLegacy*/;
  const constructor _() → opt::Class5<opt::Class5::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends dynamic>() → opt::Class5<opt::Class5::redirect::T%>
    return new opt::Class5::_<opt::Class5::redirect::T%>();
  static factory constRedirect<T extends dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
    return new opt::Class5::_<opt::Class5::constRedirect::T%>();
  static factory fact<T extends dynamic>() → opt::Class5<opt::Class5::fact::T%>
    return new opt::Class5::_<opt::Class5::fact::T%>();
}
static method testOptIn() → dynamic {
  new opt::Class1::_<core::Object?>();
  new opt::Class1::_<core::Object?>();
  #C16;
  opt::Class1::fact<core::Object?>();
  new opt::Class2::_<core::Object>();
  new opt::Class2::_<core::Object>();
  #C2;
  opt::Class2::fact<core::Object>();
  new opt::Class3::_<core::String>();
  new opt::Class3::_<core::String>();
  #C3;
  opt::Class3::fact<core::String>();
  new opt::Class4::_<dynamic>();
  new opt::Class4::_<dynamic>();
  #C4;
  opt::Class4::fact<dynamic>();
  new opt::Class5::_<dynamic>();
  new opt::Class5::_<dynamic>();
  #C5;
  opt::Class5::fact<dynamic>();
}

constants  {
  #C1 = opt::Class1<core::Object*> {}
  #C2 = opt::Class2<core::Object*> {}
  #C3 = opt::Class3<core::String*> {}
  #C4 = opt::Class4<dynamic> {}
  #C5 = opt::Class5<dynamic> {}
  #C6 = constructor-tearoff opt::Class1::redirect
  #C7 = constructor-tearoff opt::Class1::constRedirect
  #C8 = constructor-tearoff opt::Class2::redirect
  #C9 = constructor-tearoff opt::Class2::constRedirect
  #C10 = constructor-tearoff opt::Class3::redirect
  #C11 = constructor-tearoff opt::Class3::constRedirect
  #C12 = constructor-tearoff opt::Class4::redirect
  #C13 = constructor-tearoff opt::Class4::constRedirect
  #C14 = constructor-tearoff opt::Class5::redirect
  #C15 = constructor-tearoff opt::Class5::constRedirect
  #C16 = opt::Class1<core::Object?> {}
}


Constructor coverage from constants:
org-dartlang-testcase:///main.dart:
- Class1._ (from org-dartlang-testcase:///opt_in_lib.dart:10:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- Class2._ (from org-dartlang-testcase:///opt_in_lib.dart:18:9)
- Class3._ (from org-dartlang-testcase:///opt_in_lib.dart:26:9)
- Class4._ (from org-dartlang-testcase:///opt_in_lib.dart:34:9)
- Class5._ (from org-dartlang-testcase:///opt_in_lib.dart:42:9)

org-dartlang-testcase:///opt_in_lib.dart:
- Class1._ (from org-dartlang-testcase:///opt_in_lib.dart:10:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- Class2._ (from org-dartlang-testcase:///opt_in_lib.dart:18:9)
- Class3._ (from org-dartlang-testcase:///opt_in_lib.dart:26:9)
- Class4._ (from org-dartlang-testcase:///opt_in_lib.dart:34:9)
- Class5._ (from org-dartlang-testcase:///opt_in_lib.dart:42:9)
