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

typedef F<T extends core::Object* = dynamic> = (T*) →* void;
typedef G<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 {}
