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

class C<T extends core::Object* = dynamic> extends core::Object {
  constructor optional(([self::C::T*]) →* void func) → self::C<self::C::T*>*
    : super core::Object::•() {}
  constructor named(({x: self::C::T*}) →* void func) → self::C<self::C::T*>*
    : super core::Object::•() {}
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method optional_toplevel([dynamic x = #C2]) → void {}
static method named_toplevel({dynamic x = #C2}) → void {}
static method main() → dynamic {
  function optional_local([dynamic x = #C2]) → void {}
  function named_local({dynamic x = #C2}) → void {}
  self::C<dynamic>* c_optional_toplevel = new self::C::optional<dynamic>(#C3);
  self::C<dynamic>* c_named_toplevel = new self::C::named<dynamic>(#C4);
  self::C<dynamic>* c_optional_local = new self::C::optional<dynamic>(optional_local);
  self::C<dynamic>* c_named_local = new self::C::named<dynamic>(named_local);
  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → Null {});
  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → Null {});
}

constants  {
  #C1 = 0
  #C2 = <core::int*>[#C1]
  #C3 = tearoff self::optional_toplevel
  #C4 = tearoff self::named_toplevel
}
