library test;
import self as self;
import "dart:core" as core;

abstract class C<E extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::E*>*
    : super core::Object::•()
    ;
  method sort([(self::C::E*, self::C::E*) →* core::int* compare = #C1]) → void {
    self::C::sort2<self::C::E*>(this, let final (self::C::E*, self::C::E*) →* core::int* #t1 = compare in #t1.{core::Object::==}(null) ?{(self::C::E*, self::C::E*) →* core::int*} #C2 : #t1);
  }
  static method _compareAny(dynamic a, dynamic b) → core::int* {
    throw "unimplemented";
  }
  static method sort2<E extends core::Object* = dynamic>(self::C<self::C::sort2::E*>* a, (self::C::sort2::E*, self::C::sort2::E*) →* core::int* compare) → void {
    throw "unimplemented";
  }
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
static method main() → dynamic {}

constants  {
  #C1 = null
  #C2 = tearoff self::C::_compareAny
}
