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};
}
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 {}
