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) → core::Null*
    return null;
}
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 {}
}
