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

typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
typedef G<contravariant T extends core::Object* = dynamic> = () →* (T*) →* void;
class C<T extends core::Object* = dynamic> extends core::Object {
  field (self::C::T*) →* void _x;
  constructor •((self::C::T*) →* void _x) → self::C<self::C::T*>*
    : self::C::_x = _x, super core::Object::•()
    ;
  method f() → (self::C::T*) →* void
    return this.{self::C::_x};
  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 g(self::C<core::num*>* c) → () →* (core::num*) →* void {
  return c.{self::C::f} as{TypeError,CovarianceCheck} () →* (core::num*) →* void;
}
static method h(core::int* i) → void {
  core::print("${i}");
}
static method test() → void {
  () →* (core::num*) →* void x = self::g(new self::C::•<core::int*>(#C1));
}
static method main() → void {}

constants  {
  #C1 = tearoff self::h
}
