library #lib /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

abstract class A<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::A<self::A::T%>
    : super core::Object::•()
    ;
}
class B<T extends core::Object? = dynamic> extends self::A<self::B::T%> {
  synthetic constructor •() → self::B<self::B::T%>
    : super self::A::•()
    ;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i]  method testT1() → dynamic
    return _in::unsafeCast<self::B::T%>(#C1);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method testT2negative() → dynamic
    return (#C2) as{ForNonNullableByDefault} self::B::T%;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method testT3() → dynamic
    return _in::unsafeCast<self::B::T%>(#C2);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] [@vm.unboxing-info.metadata=()->i]  method testNullableT1() → dynamic
    return _in::unsafeCast<self::B::T?>(#C1);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method testNullableT2() → dynamic
    return _in::unsafeCast<self::B::T?>(#C2);
}
[@vm.unboxing-info.metadata=()->i]static method testInt1() → dynamic
  return _in::unsafeCast<core::int>(#C1);
static method testInt2negative() → dynamic
  return (#C2) as{ForNonNullableByDefault} core::int;
[@vm.unboxing-info.metadata=()->i]static method testNullableInt1() → dynamic
  return _in::unsafeCast<core::int?>(#C1);
static method testNullableInt2() → dynamic
  return _in::unsafeCast<core::int?>(#C2);
static method testDynamic() → dynamic
  return _in::unsafeCast<dynamic>(#C3);
static method testObjectNegative() → dynamic
  return let dynamic #t1 = #C2 in true ?{core::Object} #t1 as{ForNonNullableByDefault} core::Object : #t1{core::Object};
static method testNullableObject() → dynamic
  return #C2;
static method testAOfNum1([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
  return _in::unsafeCast<self::A<core::num>>(x);
static method testAOfNum2negative([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
  return x as{ForNonNullableByDefault} self::A<core::num>;
static method testAOfNum3negative() → dynamic
  return (#C2) as{ForNonNullableByDefault} self::A<core::num>;
static method testAOfNullableNum([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
  return _in::unsafeCast<self::A<core::num?>>(x);
static method testNullableAOfNum() → dynamic
  return _in::unsafeCast<self::A<core::num>?>(#C2);
static method testNullableAOfNumNegative([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
  return x as{ForNonNullableByDefault} self::A<core::num>?;
static method testNullableAOfNullableNum([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
  return _in::unsafeCast<self::A<core::num?>?>(x);
static method main() → void {
  self::testInt1();
  self::testInt2negative();
  self::testNullableInt1();
  self::testNullableInt2();
  self::testDynamic();
  self::testObjectNegative();
  self::testNullableObject();
  self::testAOfNum1(new self::B::•<core::int>());
  self::testAOfNum2negative(new self::B::•<core::int?>());
  self::testAOfNum3negative();
  self::testAOfNullableNum(new self::B::•<core::int?>());
  self::testNullableAOfNum();
  self::testNullableAOfNumNegative(new self::B::•<core::int?>());
  self::testNullableAOfNullableNum(new self::B::•<core::int?>());
  [@vm.direct-call.metadata=#lib::B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT1}();
  [@vm.direct-call.metadata=#lib::B.testT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT2negative}();
  [@vm.direct-call.metadata=#lib::B.testT3] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int?>().{self::B::testT3}();
  [@vm.direct-call.metadata=#lib::B.testNullableT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT1}();
  [@vm.direct-call.metadata=#lib::B.testNullableT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT2}();
}
