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