library;
import self as self;
import "dart:core" as core;

class A8<X extends (self::A8::X, self::A8::Y) = (dynamic, core::num), Y extends core::num> extends core::Object {
  synthetic constructor •() → self::A8<self::A8::X, self::A8::Y>
    : super core::Object::•()
    ;
}
class A9<X extends (self::A9::Y, self::A9::Z%) = (core::num, core::String?), Y extends core::num, Z extends core::String?> extends core::Object {
  synthetic constructor •() → self::A9<self::A9::X, self::A9::Y, self::A9::Z%>
    : super core::Object::•()
    ;
}
class A10<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::A10<self::A10::X%, self::A10::Y%>
    : super core::Object::•()
    ;
}
static method foo1((core::int, core::String?) r) → dynamic {
  (core::int, core::String?) r2 = r;
}
static method foo2((core::int, core::String?) r, <X extends core::Object? = dynamic>() → X% f) → dynamic {
  r = (0, f<core::String?>(){() → core::String?});
}
static method foo3() → dynamic {
  (core::num, core::num) r = let final(core::int, core::double) #t1 = (3, 3.5) in block {
    #t1.$1{core::int}.{core::int::isEven}{core::bool};
  } =>#t1;
}
static method foo4() → dynamic {
  (core::num, core::num) r = ((3 as dynamic) as{TypeError,ForDynamic} core::num, 3.5);
}
static method foo5((core::int, core::String?) r, <X extends core::Object? = dynamic>() → (core::int, X%) f) → dynamic {
  r = f<core::String?>(){() → (core::int, core::String?)};
}
static method foo6(<X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(X%, Y%) → (X%, Y%) f, core::int x, core::String y) → dynamic {
  (core::int, core::String) r = f<core::int, core::String>(x, y){(core::int, core::String) → (core::int, core::String)};
}
static method foo7(<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic>(X%, Y%, Z%) → (X%, (Y%, Z%)) f, core::int x, core::String y, core::bool? z) → dynamic {
  (core::int, (core::String, core::bool?)) r = f<core::int, core::String, core::bool?>(x, y, z){(core::int, core::String, core::bool?) → (core::int, (core::String, core::bool?))};
}
static method foo8(self::A8<(dynamic, core::num), core::num> a) → dynamic {}
static method foo9(self::A9<(core::num, core::String?), core::num, core::String?> a) → dynamic {}
static method foo10<T extends core::Object? = dynamic>() → self::A10<(self::foo10::T%, self::foo10::T%), self::foo10::T%>
  return throw 0;
static method bar10() → dynamic {
  self::A10<core::Record, core::String> r = self::foo10<core::String>();
}
static method main() → dynamic {}
