On Sunday, 4 July 2021 at 08:24:36 UTC, Luis wrote:
On Saturday, 3 July 2021 at 22:52:39 UTC, frame wrote:

It works if you replace printf() with writeln() or use writeln() after. There must be some buffer issue.

Not works as you expected.
Yes, replacing by writeln (better said, putting a writeln) makes it to work. More weird,

Dennis's explanation makes the most sense:

writeln can throw an Exception, so its presence prevents nothrow inference, which otherwise permits the (not intended to be catchable) RangeError to exit without properly unwinding the stack.

By that, what you're running into is an unpleasant interaction between
1. scope(exit)s that you're writing
2. Errors being thrown rather than Exceptions
3. anonymous functions getting inferred as nothrow

And a resolution could be to submit an issue to make #1 prevent #3: if someone wants nothrow on an anonoymous function with scope guards, they have to make it explicit.

And while checking for prior issues like this, I found

https://issues.dlang.org/show_bug.cgi?id=17494

Not cleaning up after an Error is thrown is allowed by the D spec. This enhancement allows much better code to be generated for `nothrow` code when `scope` is used. It will also not unwind declarations with destructors in `nothrow` code when Errors are thrown.

I read this initially as "it is a bug for scope(exit) to ever run after an Error is thrown", but it's an optimization for nothrow code, which fits what you're seeing.

Reply via email to