On Thursday, 23 November 2023 at 21:52:56 UTC, Jonathan M Davis wrote:

I'd have to take the time to study your code in detail to see whether what exactly you're seeing makes sense or not ...


My apologies... I should have proposed a more specific example.

```d
interface IOpt {  bool opEquals(IOpt other) const @safe pure;  }

class None : IOpt { bool opEquals(IOpt other) const @safe pure => true; }

void main() {
  None
    a = new None(),
    b = new None();

  IOpt
    a2 = a,
    b2 = b;

  assert(a == b);
  assert(a2 == a);
  assert(b2 == b);
  assert(a2 == b2); // fails!!!
}

```


== on classes results in the free function, opEquals, in object.d being called. That function does a variety of checks such as checking whether either reference is null (to avoid dereferencing null) and using is to compare the address of the class references first (to avoid calling the class' opEquals if both references are to the same object). It also makes sure that both rhs.opEquals(lhs) and lhs.opEquals(rhs) are true for == to be true to avoid subtle bugs that can come into play when comparing a base class against a derived class.

https://github.com/dlang/dmd/blob/master/druntime/src/object.d#L269


Replacing ```interface``` by ```abstract class``` removes the problem. But I have not enough D knowledge to discover why interface version is not working


Thanks
Antonio



Reply via email to