RFC: Change what assert does on error

Dukc ajieskola at gmail.com
Mon Jul 7 21:44:49 UTC 2025


On Sunday, 6 July 2025 at 23:53:54 UTC, Timon Gehr wrote:
> The insane part is that we are in fact allowed to throw in 
> `@safe nothrow` functions without any `@trusted` shenanigans. 
> Such code should not be allowed to break any compiler 
> assumptions.

Technically, memory safety is supposed to be guaranteed by not 
letting you _catch_ unrecoverable throwables in `@safe`. When you 
do catch them, you're supposed to verify that any code you have 
in the try block (including called functions) doesn't rely on 
destructors or similar for memory safety.

I understand this is problematic, because in practice pretty much 
all code often is guarded by a top-level pokemon catcher, meaning 
destructor-relying memory safety isn't going to fly anywhere. I 
guess we should just learn to not do that, or else give up on all 
`nothrow` optimisations. I tend to agree with Dennis that a 
switch is not the way to go as that might cause incompatibilities 
when different libraries expect different settings.

In idea: What if we retained the `nothrow` optimisations, but 
changed the finally blocks so they are never executed for 
non-`Exception` `Throwable`s unless there is a catch block for 
one? Still skipping destructors, but at least the rules between 
`try x; finally y;`, `scope(exit)` and destructors would stay 
consistent, and `nothrow` wouldn't be silently changing behaviour 
since the assert failures would be skipping the finalisers 
regardless. `scope(failure)` would also catch only `Exception`s.

This would have to be done over an edition switch though since it 
also breaks code.




More information about the Digitalmars-d mailing list