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

class A<T extends core::Object = dynamic> extends core::Object {
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
}
]  synthetic constructor •() → self::A<self::A::T>
    : super core::Object::•()
    ;
}
class B extends self::A<core::String> {
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target '#lib::A::'' (constructor)', arg-desc CP#0
}
]  synthetic constructor •() → self::B
    : super self::A::•()
    ;
}
class C<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic, T3 extends core::Object = dynamic> extends self::B {
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData target '#lib::B::'' (constructor)', arg-desc CP#0
}
]  synthetic constructor •() → self::C<self::C::T1, self::C::T2, self::C::T3>
    : super self::B::•()
    ;
}
class D<P extends core::Object = dynamic, Q extends core::Object = dynamic> extends self::C<core::int, self::D::Q, self::D::P> {
  generic-covariant-impl field core::Map<self::D::P, self::D::Q> foo;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-6]
  Push                 FP[-5]
  PushConstant         CP#0
  Push                 FP[-6]
  LoadTypeArgumentsField CP#1
  PushNull
  PushConstant         CP#2
  AssertAssignable     0, CP#3
  StoreFieldTOS        CP#4
  Push                 FP[-6]
  PushConstant         CP#7
  IndirectStaticCall   1, CP#6
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
  [1] = TypeArgumentsField #lib::D
  [2] = String ''
  [3] = SubtypeTestCache
  [4] = InstanceField #lib::D::foo (field)
  [5] = Reserved
  [6] = ArgDesc num-args 1, num-type-args 0, names []
  [7] = StaticICData target '#lib::C::'' (constructor)', arg-desc CP#6
}
]  constructor •(dynamic tt) → self::D<self::D::P, self::D::Q>
    : self::D::foo = tt as{TypeError} core::Map<self::D::P, self::D::Q>, super self::C::•()
    ;
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#1
  InstanceCall         4, CP#3
  JumpIfFalse          L1
  PushConstant         CP#4
  PushConstant         CP#6
  IndirectStaticCall   1, CP#5
  Drop1
L1:
  Push                 FP[-5]
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#7
  InstanceCall         4, CP#8
  JumpIfFalse          L2
  PushConstant         CP#9
  PushConstant         CP#10
  IndirectStaticCall   1, CP#5
  Drop1
L2:
  Push                 FP[-6]
  Push                 FP[-5]
  PushConstant         CP#11
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#12
  AssertAssignable     0, CP#13
  InstanceCall         2, CP#15
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = TypeArgumentsField #lib::D
  [1] = Type #lib::A < #lib::D::TypeParam/0 >
  [2] = ArgDesc num-args 4, num-type-args 0, names []
  [3] = ICData target-name '_instanceOf', arg-desc CP#2
  [4] = String '21'
  [5] = ArgDesc num-args 1, num-type-args 0, names []
  [6] = StaticICData target 'dart:core::print', arg-desc CP#5
  [7] = Type #lib::C < dynamic, #lib::D::TypeParam/1, dart:core::List < #lib::D::TypeParam/0 > >
  [8] = ICData target-name '_instanceOf', arg-desc CP#2
  [9] = String '22'
  [10] = StaticICData target 'dart:core::print', arg-desc CP#5
  [11] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
  [12] = String ''
  [13] = SubtypeTestCache
  [14] = ArgDesc num-args 2, num-type-args 0, names []
  [15] = ICData set target-name 'set:foo', arg-desc CP#14
}
]  method foo2(dynamic y) → dynamic {
    if(y is self::A<self::D::P>) {
      core::print("21");
    }
    if(y is self::C<dynamic, self::D::Q, core::List<self::D::P>>) {
      core::print("22");
    }
    [@vm.call-site-attributes.metadata=receiverType:#lib::D<#lib::D::P, #lib::D::Q>] this.{self::D::foo} = y as{TypeError} core::Map<self::D::P, self::D::Q>;
  }
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  CheckFunctionTypeArgs 2, r0
  Push                 FP[-5]
  PushNull
  Push                 r0
  PushConstant         CP#0
  InstanceCall         4, CP#2
  JumpIfFalse          L1
  PushConstant         CP#3
  PushConstant         CP#5
  IndirectStaticCall   1, CP#4
  Drop1
L1:
  Push                 FP[-5]
  Push                 FP[-6]
  LoadTypeArgumentsField CP#6
  Push                 r0
  PushConstant         CP#7
  InstanceCall         4, CP#8
  JumpIfFalse          L2
  PushConstant         CP#9
  PushConstant         CP#10
  IndirectStaticCall   1, CP#4
  Drop1
L2:
  Push                 FP[-5]
  PushConstant         CP#11
  Push                 FP[-6]
  LoadTypeArgumentsField CP#6
  Push                 r0
  PushConstant         CP#12
  AssertAssignable     0, CP#13
  InstanceCall         1, CP#14
  ReturnTOS
}
ConstantPool {
  [0] = Type #lib::A < #lib::D::foo3::TypeParam/0 >
  [1] = ArgDesc num-args 4, num-type-args 0, names []
  [2] = ICData target-name '_instanceOf', arg-desc CP#1
  [3] = String '31'
  [4] = ArgDesc num-args 1, num-type-args 0, names []
  [5] = StaticICData target 'dart:core::print', arg-desc CP#4
  [6] = TypeArgumentsField #lib::D
  [7] = Type #lib::C < dart:core::Map < #lib::D::foo3::TypeParam/0, #lib::D::TypeParam/0 >, dart:core::List < #lib::D::foo3::TypeParam/1 >, #lib::D::TypeParam/1 >
  [8] = ICData target-name '_instanceOf', arg-desc CP#1
  [9] = String '32'
  [10] = StaticICData target 'dart:core::print', arg-desc CP#4
  [11] = Type dart:core::Map < #lib::D::foo3::TypeParam/1, #lib::D::TypeParam/1 >
  [12] = String ' in type cast'
  [13] = SubtypeTestCache
  [14] = ICData get target-name 'get:values', arg-desc CP#4
}
]  method foo3<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic>(dynamic z) → dynamic {
    if(z is self::A<self::D::foo3::T1>) {
      core::print("31");
    }
    if(z is self::C<core::Map<self::D::foo3::T1, self::D::P>, core::List<self::D::foo3::T2>, self::D::Q>) {
      core::print("32");
    }
    return (z as core::Map<self::D::foo3::T2, self::D::Q>).{core::Map::values};
  }
[@vm.bytecode=
Bytecode {
  Entry                2
  CheckStack           0
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  InstantiateTypeArgumentsTOS 0, CP#1
  StoreLocal           r1
  Push                 r1
  PushInt              1
  CreateArrayTOS
  StoreLocal           r1
  Push                 r1
  PushInt              0
  Push                 FP[-5]
  PushConstant         CP#2
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#3
  AssertAssignable     0, CP#4
  StoreIndexedTOS
  PushConstant         CP#6
  IndirectStaticCall   2, CP#5
  PopLocal             r0
  Push                 FP[-5]
  PushConstant         CP#2
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  PushConstant         CP#3
  AssertAssignable     0, CP#7
  ReturnTOS
}
ConstantPool {
  [0] = TypeArgumentsField #lib::D
  [1] = TypeArgs [dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >]
  [2] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
  [3] = String ''
  [4] = SubtypeTestCache
  [5] = ArgDesc num-args 2, num-type-args 0, names []
  [6] = StaticICData target 'dart:core::List::_fromLiteral (constructor)', arg-desc CP#5
  [7] = SubtypeTestCache
}
]  method foo4(dynamic w) → core::Map<self::D::P, self::D::Q> {
    core::List<core::Map<self::D::P, self::D::Q>> list = <core::Map<self::D::P, self::D::Q>>[w as{TypeError} core::Map<self::D::P, self::D::Q>];
    return w as{TypeError} core::Map<self::D::P, self::D::Q>;
  }
}
class E<P extends core::String = core::String> extends core::Object {
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}
]  static factory •<P extends core::String = dynamic>() → self::E<self::E::•::P>
    return null;
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  CheckFunctionTypeArgs 2, r0
  JumpIfNotZeroTypeArgs L1
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  PushNull
  InstantiateTypeArgumentsTOS 0, CP#1
  PopLocal             r0
L1:
  Push                 FP[-6]
  LoadTypeArgumentsField CP#0
  Push                 r0
  PushConstant         CP#2
  PushConstant         CP#3
  PushConstant         CP#4
  AssertSubtype
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = TypeArgumentsField #lib::E
  [1] = TypeArgs [#lib::E::TypeParam/0, dart:core::List < #lib::E::TypeParam/0 >]
  [2] = Type #lib::E::foo6::TypeParam/0
  [3] = Type #lib::E::TypeParam/0
  [4] = String 'T'
}
]  method foo6<generic-covariant-impl T extends self::E::P = self::E::P, U extends core::List<self::E::foo6::T> = core::List<self::E::P>>(core::Map<self::E::foo6::T, self::E::foo6::U> map) → void {}
}
static field core::List<core::Iterable<dynamic>> globalVar;
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#0
  InstanceCall         2, CP#2
  JumpIfFalse          L1
  PushConstant         CP#3
  PushConstant         CP#5
  IndirectStaticCall   1, CP#4
  Drop1
L1:
  Push                 FP[-5]
  PushNull
  PushNull
  PushConstant         CP#6
  InstanceCall         4, CP#8
  JumpIfFalse          L2
  PushConstant         CP#9
  PushConstant         CP#10
  IndirectStaticCall   1, CP#4
  Drop1
L2:
  Push                 FP[-5]
  PushConstant         CP#11
  PushNull
  PushNull
  PushConstant         CP#12
  AssertAssignable     0, CP#13
  ReturnTOS
}
ConstantPool {
  [0] = Type #lib::B
  [1] = ArgDesc num-args 2, num-type-args 0, names []
  [2] = ICData target-name '_simpleInstanceOf', arg-desc CP#1
  [3] = String '11'
  [4] = ArgDesc num-args 1, num-type-args 0, names []
  [5] = StaticICData target 'dart:core::print', arg-desc CP#4
  [6] = Type #lib::C < dart:core::int, dart:core::Object, dynamic >
  [7] = ArgDesc num-args 4, num-type-args 0, names []
  [8] = ICData target-name '_instanceOf', arg-desc CP#7
  [9] = String '12'
  [10] = StaticICData target 'dart:core::print', arg-desc CP#4
  [11] = Type #lib::A < dart:core::int >
  [12] = String ' in type cast'
  [13] = SubtypeTestCache
}
]static method foo1(dynamic x) → dynamic {
  if(x is self::B) {
    core::print("11");
  }
  if(x is self::C<core::int, core::Object, dynamic>) {
    core::print("12");
  }
  return x as self::A<core::int>;
}
[@vm.bytecode=
Bytecode {
  Entry                1
  CheckStack           0
  Push                 FP[-5]
  PushConstant         CP#0
  PushNull
  PushNull
  PushConstant         CP#1
  AssertAssignable     0, CP#2
  StoreStaticTOS       CP#3
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = Type dart:core::List < dart:core::Iterable < dynamic > >
  [1] = String ''
  [2] = SubtypeTestCache
  [3] = StaticField #lib::globalVar (field)
}
]static method foo5(dynamic x) → void {
  self::globalVar = x as{TypeError} core::List<core::Iterable<dynamic>>;
}
[@vm.bytecode=
Bytecode {
  Entry                0
  CheckStack           0
  PushNull
  ReturnTOS
}
ConstantPool {
}
]static method main() → dynamic {}
