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

class C<E extends core::Object> extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method barA([(self::C::E, self::C::E) → core::int cmp = null]) → void {
    self::foo<self::C::E>(this, let final (self::C::E, self::C::E) → core::int #t1 = cmp in #t1.==(null) ?{(self::C::E, self::C::E) → core::int} self::C::_default : #t1);
  }
  method barB([(self::C::E, self::C::E) → core::int cmp = null]) → void {
    self::foo<self::C::E>(this, let final (self::C::E, self::C::E) → core::int #t2 = cmp in #t2.==(null) ?{(self::C::E, self::C::E) → core::int} self::C::_default as (self::C::E, self::C::E) → core::int : #t2);
  }
  method barC([(self::C::E, self::C::E) → core::int cmp = null]) → void {
    (self::C::E, self::C::E) → core::int v = self::C::_default;
    self::foo<self::C::E>(this, let final (self::C::E, self::C::E) → core::int #t3 = cmp in #t3.==(null) ?{(self::C::E, self::C::E) → core::int} v : #t3);
  }
  method barD([(self::C::E, self::C::E) → core::int cmp = null]) → void {
    self::foo<self::C::E>(this, let final (self::C::E, self::C::E) → core::int #t4 = cmp in #t4.==(null) ?{(self::C::E, self::C::E) → core::int} self::C::_default : #t4);
  }
  method barE([(self::C::E, self::C::E) → core::int cmp = null]) → void {
    self::foo<self::C::E>(this, cmp.{core::Object::==}(null) ?{(self::C::E, self::C::E) → core::int} self::C::_default : cmp);
  }
  method barF([(self::C::E, self::C::E) → core::int cmp = null]) → void {
    self::foo<self::C::E>(this, !cmp.{core::Object::==}(null) ?{(self::C::E, self::C::E) → core::int} cmp : self::C::_default);
  }
  static method _default(dynamic a, dynamic b) → core::int {
    return 1.{core::int::unary-}();
  }
}
static method foo<E extends core::Object>(self::C<self::foo::E> c, (self::foo::E, self::foo::E) → core::int cmp) → void {}
static method main() → dynamic {}
