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

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([@vm.inferred-type.metadata=#lib::A<dart.core::String>] dynamic x) → dynamic
    return x as{ForNonNullableByDefault} self::B::T%;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method testAOfT1([@vm.inferred-type.metadata=#lib::A<#lib::A<dart.core::int>>] dynamic x) → dynamic
    return _in::unsafeCast<self::A<self::B::T%>>(x);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method testAOfT2negative([@vm.inferred-type.metadata=#lib::A<#lib::A<dart.core::num>>] dynamic x) → dynamic
    return x as{ForNonNullableByDefault} self::A<self::B::T%>;
}
[@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);
static method testDynamic() → dynamic
  return _in::unsafeCast<dynamic>(#C3);
static method testObject() → dynamic
  return #C4;
static method testBOfInt([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
  return _in::unsafeCast<self::B<core::int>>(x);
static method testAOfInt([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
  return _in::unsafeCast<self::A<core::int>>(x);
static method testAOfNum([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
  return _in::unsafeCast<self::A<core::num>>(x);
static method testAOfAOfB1([@vm.inferred-type.metadata=#lib::A<#lib::A<#lib::B<dynamic>>>] dynamic x) → dynamic
  return _in::unsafeCast<self::A<self::A<self::B<dynamic>>>>(x);
static method testAOfAOfB2negative([@vm.inferred-type.metadata=#lib::A<#lib::A<#lib::A<dynamic>>>] dynamic x) → dynamic
  return x as{ForNonNullableByDefault} self::A<self::A<self::B<dynamic>>>;
static method main() → void {
  self::testInt1();
  self::testInt2();
  self::testDynamic();
  self::testObject();
  self::testBOfInt(new self::B::•<core::int>());
  self::testAOfInt(new self::B::•<core::int>());
  self::testAOfNum(new self::B::•<core::int>());
  self::testAOfAOfB1(new self::A::•<self::A<self::B<dynamic>>>());
  self::testAOfAOfB2negative(new self::A::•<self::A<self::A<dynamic>>>());
  [@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.testT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int>>().{self::B::testT2negative}(new self::A::•<core::String>()){(dynamic) → dynamic};
  [@vm.direct-call.metadata=#lib::B.testAOfT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int>>().{self::B::testAOfT1}(new self::A::•<self::A<core::int>>()){(dynamic) → dynamic};
  [@vm.direct-call.metadata=#lib::B.testAOfT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int>>().{self::B::testAOfT2negative}(new self::A::•<self::A<core::num>>()){(dynamic) → dynamic};
}
constants  {
  #C1 = 42
  #C2 = null
  #C3 = "hi"
  #C4 = "bye"
}
