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

class NullEquality extends core::Object {
  synthetic constructor •() → self::NullEquality*
    : super core::Object::•()
    ;
  @#C1
  operator ==(core::Object* other) → Null
    return null;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class SubNullEquality extends self::NullEquality {
  synthetic constructor •() → self::SubNullEquality*
    : super self::NullEquality::•()
    ;
  method test() → void {
    core::bool* super_equals_self = super.{self::NullEquality::==}(this);
    core::bool* super_equals_null = super.{self::NullEquality::==}(null);
    core::bool* super_not_equals_self = !super.{self::NullEquality::==}(this);
    core::bool* super_not_equals_null = !super.{self::NullEquality::==}(null);
  }
}
static method test() → dynamic {
  self::NullEquality* n = new self::NullEquality::•();
  core::bool* equals_self = n.{self::NullEquality::==}(n);
  core::bool* equals_null = n.{self::NullEquality::==}(null);
  core::bool* null_equals = null.{core::Object::==}(n);
  core::bool* not_equals_self = !n.{self::NullEquality::==}(n);
  core::bool* not_equals_null = !n.{self::NullEquality::==}(null);
  core::bool* null_not_equals = !null.{core::Object::==}(n);
}
static method main() → dynamic {
  self::test();
  new self::SubNullEquality::•().{self::SubNullEquality::test}();
}

constants  {
  #C1 = core::_Override {}
}
