On Saturday, 3 July 2021 at 17:47:47 UTC, Dennis wrote:
> On Saturday, 3 July 2021 at 17:20:47 UTC, Luis wrote:
> scope(exit) inside of a anonymous functions, it's never called.
I think the compiler infers the function nothrow
since you don't throw any Exception
, only an Error
. Errors represent unrecoverable bugs, after which the program is in an invalid state, so the compiler is free to exit immediately without caring about destructors or scope(exit)
. Use Exception
instead of Error
if you want the stack to properly unwind.
Indeed, this is happening.
I can reproduce with this :
#!/usr/bin/env dub
/+ dub.sdl:
dependency "pijamas" version="~>1.1"
+/
import core.exception;
void main() {
import core.stdc.stdio;
import pijamas;
should(() {
printf("Hello\n");
scope(exit) printf("Bye\n");
throw new RangeError("bla bla");
}).Throw!RangeError;
auto f = () {
printf("Hello\n");
scope(exit) printf("Bye\n");
throw new RangeError("bla bla");
};
f();
}
Outputs this :
$ f.d
Hello
Hello
core.exception.RangeError@bla bla(20): Range violation
----------------
source/f.d:20 nothrow void f.main().__lambda2() [0x5647d46a17db]
source/f.d:22 _Dmain [0x5647d46a1732]
Program exited with code 1
If I change the RangeError, by a Exception, then the scope(exit) it's executed.