On Wednesday, 21 March 2018 at 11:13:41 UTC, Simen Kjærås wrote:
On Wednesday, 21 March 2018 at 08:49:11 UTC, Mike Franklin wrote:

I think `rt_finalize` can be made `@nogc` in the runtime.

And this is where you're wrong. Consider this:

class A {
    @nogc ~this() {}
}

class B : A {
    ~this() {}
}

A a = new B();
destroy(a); // Is this @nogc?


Essentially, since @nogc and other qualifiers aren't inherited on dtors, it's impossible to know if destroying an instance of a non-final class is @nogc.

There's one case where you can: final classes where no superclass and no member defines a non-@nogc destructor.

In order for this to be done in the general case, dtors need to inherit their qualifiers somehow. That's at the very least a DIP, and any chosen path is highly likely to break existing code.

--
  Simen

You can simply check the .dtor symbols at compile time to see if every .dtor symbol from child to root have a .dtor that have the @nogc attribute(and other attributes as well). If it does, add that attribute to destroy.

Reply via email to