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

class A extends core::Object {
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
}
class B extends self::A {
  synthetic constructor •() → self::B*
    : super self::A::•()
    ;
  operator +(self::C* v) → self::A*
    return null;
  operator -(core::int* i) → self::B*
    return null;
  operator *(self::B* v) → self::B*
    return null;
  operator &(self::A* v) → self::C*
    return null;
}
class C extends self::B {
  synthetic constructor •() → self::C*
    : super self::B::•()
    ;
}
static method f<T extends core::Object* = dynamic>() → self::f::T*
  return null;
static method test() → void {
  self::B* local;
  local = self::f<self::B*>();
  local.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : null;
  local = local.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
  local = local.{self::B::*}(self::f<self::B*>());
  local = local.{self::B::&}(self::f<self::A*>());
  local = local.{self::B::-}(1);
  local = local.{self::B::-}(1);
  self::B* v1 = local = self::f<self::B*>();
  self::B* v2 = let final self::B* #t1 = local in #t1.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : #t1;
  self::A* v3 = local = local.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
  self::B* v4 = local = local.{self::B::*}(self::f<self::B*>());
  self::C* v5 = local = local.{self::B::&}(self::f<self::A*>());
  self::B* v6 = local = local.{self::B::-}(1);
  self::B* v7 = let final self::B* #t2 = local in let final self::B* #t3 = local = #t2.{self::B::-}(1) in #t2;
}
static method main() → dynamic {}
