Don wrote:
Andrei Alexandrescu wrote:
Walter Bright wrote:
Brad Roberts wrote:
Walter Bright wrote:
Rory McGuire wrote:
I would think that if a method in a class throws then at least the
class' invariant should be run? does it?
No.
Do you consider that broken or correct?
Not sure.
TDPL says that in non-release mode, public methods have code
instrumented like this:
class C {
void m() {
__check_invariant();
scope(exit) __check_invariant();
... body ...
}
}
My understanding after a recent discussion to Walter focused on the
topic is that in case a non-Exception Error is thrown, scope(exit)
statements are not guaranteed to be executed, as aren't destructors of
local objects and finally clauses.
Andrei
There are worse problems than that...
At present, scope(exit) isn't executed if it's preceded by a label (!).
And if the scope consists of a single declaration, the compiler will ICE
if there is a destructor. Deterministic destruction is still horribly
broken.
Ouch. Well, at least these are problems we all agree what the fix should be.
Andrei