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

class C<T extends core::Object* = dynamic> extends core::Object {
  final field (self::C::T*) →* core::num* plusResult;
  constructor •((self::C::T*) →* core::num* plusResult) → self::C<self::C::T*>*
    ;
  operator +(core::int* i) → (self::C::T*) →* core::num*
    ;
}
class D extends core::Object {
  final field self::C<core::num*>* getValue;
  field (core::int*) →* core::int* setValue;
  constructor •(self::C<core::num*>* getValue) → self::D*
    ;
  get value() → self::C<core::num*>*
    ;
  set value((core::int*) →* core::int* value) → void
    ;
}
static method expectTypeError(() →* void callback) → void
  ;
static method expect(core::Object* value, core::Object* expected) → void
  ;
static method numToInt(core::num* n) → core::int*
  ;
static method numToNum(core::num* n) → core::num*
  ;
static method main() → void
  ;
