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, U extends core::Object* = dynamic> = (T*) →* U*;
class C<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::T*>*
    : super core::Object::•()
    ;
  method f1(generic-covariant-impl self::C::T* x) → void {}
  method f2(generic-covariant-impl core::List<self::C::T*>* x) → self::C::T*
    return x.{core::Iterable::first};
  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 g1(self::C<core::num*>* c) → (core::num*) →* void {
  return c.{self::C::f1};
}
static method g2(self::C<core::int*>* c, core::Object* x) → void {
  (core::Object*) →* void f = self::g1(c) as (core::Object*) →* void;
  f.call(x);
}
static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num* {
  return c.{self::C::f2};
}
static method test() → void {
  (core::num*) →* void x = self::g1(new self::C::•<core::int*>());
  x.call(1.5);
  self::g3(new self::C::•<core::int*>());
}
static method main() → dynamic {}
