On Sunday, 24 May 2020 at 08:57:28 UTC, Luis wrote:
dmd ignores @trusted or @safe on opEquals, throwing this error :

onlineapp.d(27): Error: @safe function onlineapp.__unittest_L24_C7 cannot call @system function object.opEquals

An override @system or @trusted function can't be @safe, or I it a bug ?

Also, how will this be affected by DIP1028 ?

Looking at the output, it's actually druntime's opEquals that can't be called. That's the global function that ensure opEquals is called on both sides of the comparison, and it's not @safe. This makes classes even worse to use in D than, and I'm not sure how to properly handle this. If we make it @trusted, suddenly I can call @system opEquals from @safe functions without issue.

Root cause is, classes in D all inherit from Object, which has some defaults that aren't always what you want. It seems DIP1028 will make your code automatically compile, along with this:

class C {
    override bool opEquals(Object o) @system {
        *cast(int*)123456 = 3;
        return true;

@safe void mySafeFunction() {
    assert(new C() == new C());


Reply via email to