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.first;
}
static method g1(self::C<core::num> c) → (core::num) → void {
  return 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.f2;
}
static method test() → void {
  dynamic x = self::g1(new self::C::•<core::int>());
  x.call(1.5);
  self::g3(new self::C::•<core::int>());
}
static method main() → dynamic {}
