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

class NullEquality extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  @core::override
  operator ==(core::Object other) → core::Null
    return null;
}
class SubNullEquality extends self::NullEquality {
  synthetic constructor •() → void
    : super self::NullEquality::•()
    ;
  method test() → void {
    dynamic super_equals_self = super.{self::NullEquality::==}(this);
    dynamic super_equals_null = super.{self::NullEquality::==}(null);
    dynamic super_not_equals_self = !super.{self::NullEquality::==}(this);
    dynamic super_not_equals_null = !super.{self::NullEquality::==}(null);
  }
}
static method test() → dynamic {
  self::NullEquality n = new self::NullEquality::•();
  dynamic equals_self = n.==(n);
  dynamic equals_null = n.==(null);
  dynamic null_equals = null.==(n);
  dynamic not_equals_self = !n.==(n);
  dynamic not_equals_null = !n.==(null);
  dynamic null_not_equals = !null.==(n);
}
static method main() → dynamic {
  self::test();
  new self::SubNullEquality::•().test();
}
