On Sunday, 25 July 2021 at 00:15:30 UTC, Jim wrote:


But I think `destroy()` not being @nogc even though the destructor is tagged @nogc is a bug, and it should be fixed. Because it is problematic behaviour even if we limit the usage of @nogc.

It's not a bug. The destructor being tagged has nothing to do with it. destroy can call @nogc destructors just fine. It just can't itself be called in @nogc functions.

As Paul described, the root reason is down to rt_finalize. Were it marked @nogc, then you could call destroy from @nogc code, but you wouldn't be able to call destructors that aren't @nogc---an even worse situation, IMO.

I think it's worth looking into how we can make destroy (or an alternative) available in @nogc functions as an enhancement. It's possible for extern(C) functions to be templated, so that might be a potential path. With a templated rt_finalize (or an alternative) then perhaps attribute inference could kick in and make destroy (or an alternative) callable in both @nogc functions and non.


Reply via email to