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

class Base1 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  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::', arg-desc CP#0
}
]  synthetic constructor •() → self::Base1
    : super core::Object::•()
    ;
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  CheckFunctionTypeArgs 1, 0
  PushNull
  ReturnTOS
}
ConstantPool {
}
]  method foo<T extends core::Object = dynamic>(self::Base1::foo::T a1, core::int a2) → void {}
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  PushInt              42
  ReturnTOS
}
ConstantPool {
}
]  get bar() → dynamic
    return 42;
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  PushNull
  ReturnTOS
}
ConstantPool {
}
]  set bazz(core::int x) → void {}
}
class A extends self::Base1 {
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  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::Base1::', arg-desc CP#0
}
]  synthetic constructor •() → self::A
    : super self::Base1::•()
    ;
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  PushConstant         CP#0
  Push                 FP[-6]
  PushConstant         CP#1
  PushInt              2
  PushConstant         CP#3
  IndirectStaticCall   4, CP#2
  ReturnTOS
}
ConstantPool {
  [0] = TypeArgs [dart.core::String]
  [1] = String 'a1'
  [2] = ArgDesc num-args 3, num-type-args 1, names []
  [3] = StaticICData target '#lib::Base1::foo', arg-desc CP#2
}
]  method testSuperCall(core::int x) → dynamic
    return super.{self::Base1::foo}<core::String>("a1", 2);
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData get target '#lib::Base1::foo', arg-desc CP#0
}
]  method testSuperTearOff() → dynamic
    return super.{self::Base1::foo};
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  Push                 FP[-5]
  PushConstant         CP#1
  IndirectStaticCall   1, CP#0
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 1, num-type-args 0, names []
  [1] = StaticICData get target '#lib::Base1::bar', arg-desc CP#0
}
]  method testSuperGet() → dynamic
    return super.{self::Base1::bar};
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  PushConstant         CP#0
  Push                 FP[-5]
  PushConstant         CP#2
  IndirectStaticCall   1, CP#1
  PushConstant         CP#3
  InstanceCall         3, CP#5
  ReturnTOS
}
ConstantPool {
  [0] = TypeArgs [dart.core::int]
  [1] = ArgDesc num-args 1, num-type-args 0, names []
  [2] = StaticICData get target '#lib::Base1::bar', arg-desc CP#1
  [3] = String 'param'
  [4] = ArgDesc num-args 2, num-type-args 1, names []
  [5] = ICData dynamic target-name 'call', arg-desc CP#4
}
]  method testSuperCallViaGetter() → dynamic
    return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{self::Base1::bar}.call<core::int>("param");
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  Push                 FP[-5]
  PushInt              3
  PushConstant         CP#1
  IndirectStaticCall   2, CP#0
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = ArgDesc num-args 2, num-type-args 0, names []
  [1] = StaticICData set target '#lib::Base1::bazz', arg-desc CP#0
}
]  method testSuperSet() → dynamic {
    super.{self::Base1::bazz} = 3;
  }
}
abstract class Base2 extends core::Object {
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  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::', arg-desc CP#0
}
]  synthetic constructor •() → self::Base2
    : super core::Object::•()
    ;
  abstract method foo<T extends core::Object = dynamic>(core::String a1, self::Base2::foo::T a2, core::int a3) → void;
  abstract get bar() → dynamic;
  abstract set bazz(core::int x) → void;
}
abstract class B extends self::Base2 {
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  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::Base2::', arg-desc CP#0
}
]  synthetic constructor •() → self::B
    : super self::Base2::•()
    ;
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  Push                 FP[-6]
  PushConstant         CP#0
  PushConstant         CP#1
  PushConstant         CP#2
  PushInt              5
  CreateArrayTOS
  StoreLocal           r0
  Push                 r0
  PushInt              0
  PushConstant         CP#3
  StoreIndexedTOS
  Push                 r0
  PushInt              1
  Push                 FP[-6]
  StoreIndexedTOS
  Push                 r0
  PushInt              2
  PushConstant         CP#4
  StoreIndexedTOS
  Push                 r0
  PushInt              3
  PushConstant         CP#5
  StoreIndexedTOS
  Push                 r0
  PushInt              4
  PushInt              5
  StoreIndexedTOS
  PushTrue
  PushConstant         CP#7
  IndirectStaticCall   4, CP#6
  PushConstant         CP#9
  IndirectStaticCall   2, CP#8
  ReturnTOS
}
ConstantPool {
  [0] = String 'foo'
  [1] = ArgDesc num-args 4, num-type-args 1, names []
  [2] = TypeArgs [dynamic]
  [3] = TypeArgs [dart.core::double]
  [4] = String 'a1'
  [5] = Double 3.14
  [6] = ArgDesc num-args 4, num-type-args 0, names []
  [7] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#6
  [8] = ArgDesc num-args 2, num-type-args 0, names []
  [9] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#8
}
]  method testSuperCall(core::int x) → dynamic
    return super.{self::Base2::foo}<core::double>("a1", 3.14, 5);
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  Push                 FP[-5]
  PushConstant         CP#0
  PushConstant         CP#1
  PushConstant         CP#2
  PushInt              1
  CreateArrayTOS
  StoreLocal           r0
  Push                 r0
  PushInt              0
  Push                 FP[-5]
  StoreIndexedTOS
  PushTrue
  PushConstant         CP#4
  IndirectStaticCall   4, CP#3
  PushConstant         CP#6
  IndirectStaticCall   2, CP#5
  ReturnTOS
}
ConstantPool {
  [0] = String 'foo'
  [1] = ArgDesc num-args 1, num-type-args 0, names []
  [2] = TypeArgs [dynamic]
  [3] = ArgDesc num-args 4, num-type-args 0, names []
  [4] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
  [5] = ArgDesc num-args 2, num-type-args 0, names []
  [6] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#5
}
]  method testSuperTearOff() → dynamic
    return super.{self::Base2::foo};
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  Push                 FP[-5]
  PushConstant         CP#0
  PushConstant         CP#1
  PushConstant         CP#2
  PushInt              1
  CreateArrayTOS
  StoreLocal           r0
  Push                 r0
  PushInt              0
  Push                 FP[-5]
  StoreIndexedTOS
  PushTrue
  PushConstant         CP#4
  IndirectStaticCall   4, CP#3
  PushConstant         CP#6
  IndirectStaticCall   2, CP#5
  ReturnTOS
}
ConstantPool {
  [0] = String 'bar'
  [1] = ArgDesc num-args 1, num-type-args 0, names []
  [2] = TypeArgs [dynamic]
  [3] = ArgDesc num-args 4, num-type-args 0, names []
  [4] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
  [5] = ArgDesc num-args 2, num-type-args 0, names []
  [6] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#5
}
]  method testSuperGet() → dynamic
    return super.{self::Base2::bar};
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  PushConstant         CP#0
  Push                 FP[-5]
  PushConstant         CP#1
  PushConstant         CP#2
  PushConstant         CP#3
  PushInt              1
  CreateArrayTOS
  StoreLocal           r0
  Push                 r0
  PushInt              0
  Push                 FP[-5]
  StoreIndexedTOS
  PushTrue
  PushConstant         CP#5
  IndirectStaticCall   4, CP#4
  PushConstant         CP#7
  IndirectStaticCall   2, CP#6
  PushConstant         CP#8
  InstanceCall         3, CP#10
  ReturnTOS
}
ConstantPool {
  [0] = TypeArgs [dart.core::int]
  [1] = String 'bar'
  [2] = ArgDesc num-args 1, num-type-args 0, names []
  [3] = TypeArgs [dynamic]
  [4] = ArgDesc num-args 4, num-type-args 0, names []
  [5] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#4
  [6] = ArgDesc num-args 2, num-type-args 0, names []
  [7] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#6
  [8] = String 'param'
  [9] = ArgDesc num-args 2, num-type-args 1, names []
  [10] = ICData dynamic target-name 'call', arg-desc CP#9
}
]  method testSuperCallViaGetter() → dynamic
    return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{self::Base2::bar}.call<core::int>("param");
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                1
  CheckStack
  Push                 FP[-5]
  PushConstant         CP#0
  PushConstant         CP#1
  PushConstant         CP#2
  PushInt              2
  CreateArrayTOS
  StoreLocal           r0
  Push                 r0
  PushInt              0
  Push                 FP[-5]
  StoreIndexedTOS
  Push                 r0
  PushInt              1
  PushInt              3
  StoreIndexedTOS
  PushTrue
  PushConstant         CP#4
  IndirectStaticCall   4, CP#3
  PushConstant         CP#5
  IndirectStaticCall   2, CP#1
  Drop1
  PushNull
  ReturnTOS
}
ConstantPool {
  [0] = String 'bazz'
  [1] = ArgDesc num-args 2, num-type-args 0, names []
  [2] = TypeArgs [dynamic]
  [3] = ArgDesc num-args 4, num-type-args 0, names []
  [4] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
  [5] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#1
}
]  method testSuperSet() → dynamic {
    super.{self::Base2::bazz} = 3;
  }
}
[@vm.bytecode=
Bytecode (version: stable) {
  Entry                0
  CheckStack
  PushNull
  ReturnTOS
}
ConstantPool {
}
]static method main() → dynamic {}
