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? = core::Object?> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[opt::Class1::redirect, opt::Class1::constRedirect]/*isLegacy*/;
  const constructor _() → opt::Class1<opt::Class1::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
    let<BottomType> #redirecting_factory = opt::Class1::_ in let opt::Class1::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
    let<BottomType> #redirecting_factory = opt::Class1::_ in let opt::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::fact::T%>
    return new opt::Class1::_<opt::Class1::fact::T%>();
}
class Class2<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[opt::Class2::redirect, opt::Class2::constRedirect]/*isLegacy*/;
  const constructor _() → opt::Class2<opt::Class2::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::redirect::T>
    let<BottomType> #redirecting_factory = opt::Class2::_ in let opt::Class2::redirect::T #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
    let<BottomType> #redirecting_factory = opt::Class2::_ in let opt::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::fact::T>
    return new opt::Class2::_<opt::Class2::fact::T>();
}
class Class3<T extends core::String = core::String> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[opt::Class3::redirect, opt::Class3::constRedirect]/*isLegacy*/;
  const constructor _() → opt::Class3<opt::Class3::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::String = core::String>() → opt::Class3<opt::Class3::redirect::T>
    let<BottomType> #redirecting_factory = opt::Class3::_ in let opt::Class3::redirect::T #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::String = core::String>() → opt::Class3<opt::Class3::constRedirect::T>
    let<BottomType> #redirecting_factory = opt::Class3::_ in let opt::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::String = 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>[opt::Class4::redirect, opt::Class4::constRedirect]/*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%>
    let<BottomType> #redirecting_factory = opt::Class4::_ in let opt::Class4::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::constRedirect::T%>
    let<BottomType> #redirecting_factory = opt::Class4::_ in let opt::Class4::constRedirect::T% #typeArg0 = null in invalid-expression;
  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 = dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[opt::Class5::redirect, opt::Class5::constRedirect]/*isLegacy*/;
  const constructor _() → opt::Class5<opt::Class5::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends dynamic = dynamic>() → opt::Class5<opt::Class5::redirect::T%>
    let<BottomType> #redirecting_factory = opt::Class5::_ in let opt::Class5::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends dynamic = dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
    let<BottomType> #redirecting_factory = opt::Class5::_ in let opt::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
  static factory fact<T extends dynamic = 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?>();
  #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>();
}

constants  {
  #C1 = opt::Class1<core::Object*> {}
  #C2 = opt::Class2<core::Object*> {}
  #C3 = opt::Class3<core::String*> {}
  #C4 = opt::Class4<dynamic> {}
  #C5 = opt::Class5<dynamic> {}
}


Constructor coverage from constants:
org-dartlang-testcase:///main.dart:
- Class1._ (from org-dartlang-testcase:///opt_in_lib.dart:10: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:
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:31:9)
- Class1._ (from org-dartlang-testcase:///opt_in_lib.dart:10: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)
