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

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

static method main() → dynamic {
  mai::C1<<T extends core::Object? = dynamic>(T%) → T%> c1 = new mai::C1::•<<T extends core::Object? = dynamic>(T%) → T%>();
  mai::C1<<T extends core::Object? = dynamic>(T%) → T%> c2 = new mai::C1::•<<T extends core::Object? = dynamic>(T%) → T%>();
  mai::C2<<T extends core::Object? = dynamic>() → void> c3 = new mai::C2::•<<T extends core::Object? = dynamic>() → void>();
  mai::C2<<T extends core::Object? = dynamic>() → void> c4 = new mai::C2::•<<int extends core::Object? = dynamic>() → void>();
  mai::C3<<T extends core::Object? = dynamic>() → T%> c5 = new mai::C3::•<<T extends core::Object? = dynamic>() → T%>();
  mai::C3<<T extends core::Object? = dynamic>() → T%> c6 = new mai::C3::•<<T extends core::Object? = dynamic>() → T%>();
  mai::C4<<T extends core::Object? = dynamic>(T%) → void> c7 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
  mai::C4<<T extends core::Object? = dynamic>(T%) → void> c8 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c9 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T>();
  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c11 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
}

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

typedef exp1 = <T extends core::Object? = dynamic>(T%) → T%;
typedef exp2 = <T extends core::Object? = dynamic>() → void;
typedef exp3 = <T extends core::Object? = dynamic>() → T%;
typedef exp4 = <T extends core::Object? = dynamic>(T%) → void;
typedef exp5 = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T;
typedef exp6 = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%;
class C1<X extends <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
  constructor •() → mai::C1<mai::C1::X>
    : super core::Object::•() {
    mai::expect(#C1, mai::C1::X);
  }
}
class C2<X extends <T extends core::Object? = dynamic>() → void> extends core::Object {
  constructor •() → mai::C2<mai::C2::X>
    : super core::Object::•() {
    mai::expect(#C2, mai::C2::X);
  }
}
class C3<X extends <T extends core::Object? = dynamic>() → T%> extends core::Object {
  constructor •() → mai::C3<mai::C3::X>
    : super core::Object::•() {
    mai::expect(#C3, mai::C3::X);
  }
}
class C4<X extends <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
  constructor •() → mai::C4<mai::C4::X>
    : super core::Object::•() {
    mai::expect(#C4, mai::C4::X);
  }
}
class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
  constructor •() → mai::C5<mai::C5::X>
    : super core::Object::•() {
    mai::expect(#C5, mai::C5::X);
  }
}
class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
  constructor •() → mai::C6<mai::C6::X>
    : super core::Object::•() {
    mai::expect(#C6, mai::C6::X);
  }
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → T%)
  #C2 = TypeLiteralConstant(<T extends core::Object? = dynamic>() → void)
  #C3 = TypeLiteralConstant(<T extends core::Object? = dynamic>() → T%)
  #C4 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → void)
  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T)
  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%)
}
