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 •() → void
    : super core::Object::•()
    ;
  method f1(self::C::T x) → void {}
  method f2(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 {}
