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

class B extends core::Object {
  default constructor •() → void
    ;
  method f(core::int x) → void
    ;
}
abstract class I<T extends core::Object> extends core::Object {
  default constructor •() → void
    ;
  abstract method f(self::I::T x) → void;
}
class M extends core::Object {
  default constructor •() → void
    ;
}
class C = self::B with self::M implements self::I<core::int> {
  constructor •() → void
    : super self::B::•()
    ;
}
static method g1(self::C c) → void
  ;
static method g2(self::I<core::num> i) → void
  ;
static method test() → void
  ;
static method main() → void
  ;
