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 testT2() → dynamic
    return _in::unsafeCast<self::B::T%>(#C2);
[@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 testInt2() → dynamic
  return _in::unsafeCast<core::int>(#C2);
[@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 testObject() → dynamic
  return #C2;
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 testAOfNum2([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
  return _in::unsafeCast<self::A<core::num>>(x);
static method testAOfNum3() → dynamic
  return _in::unsafeCast<self::A<core::num>>(#C2);
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 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::testInt2();
  self::testNullableInt1();
  self::testNullableInt2();
  self::testDynamic();
  self::testObject();
  self::testNullableObject();
  self::testAOfNum1(new self::B::•<core::int>());
  self::testAOfNum2(new self::B::•<core::int?>());
  self::testAOfNum3();
  self::testAOfNullableNum(new self::B::•<core::int?>());
  self::testNullableAOfNum();
  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}(){(dynamic) → dynamic};
  [@vm.direct-call.metadata=#lib::B.testT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT2}(){(dynamic) → dynamic};
  [@vm.direct-call.metadata=#lib::B.testT3] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int?>().{self::B::testT3}(){(dynamic) → dynamic};
  [@vm.direct-call.metadata=#lib::B.testNullableT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT1}(){(dynamic) → dynamic};
  [@vm.direct-call.metadata=#lib::B.testNullableT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT2}(){(dynamic) → dynamic};
}
constants  {
  #C1 = 42
  #C2 = null
  #C3 = "hi"
}
