On Sat, 10 Mar 2012 01:09:02 -0500, Jonathan M Davis <jmdavisp...@gmx.com> wrote:

On Friday, March 09, 2012 22:48:25 Timon Gehr wrote:
On 03/09/2012 10:43 PM, Jonathan M Davis wrote:
...

>> Jonathan is just speculating. And I think he is wrong.
>
> Speculating about what?
>
> - Jonathan M Davis

About how assertion failures affect struct destructors, finally
statements and scope statements. If they wouldn't be executed upon
thrown AssertError, then a _passing_ in contract could screw up the
program state. Furthermore, the implementation does execute them.

It's not speculation. There's no guessing involved. It's what I've understood
the rules of the language to be.

But I asked on dmd-internals to verify it, and Walter has stated that it just
so happens that  the destructors, scope statements, and finally blocks do
currently get run for non-Exception exceptions, but it's not guaranteed:

http://forum.dlang.org/post/4f5ae8ec.4040...@digitalmars.com

I understood this to mean, in release mode, assert(0) may simply abort without being catchable.

If assert isn't going to properly unwind the stack, then we are using the wrong tool for unit tests. Asserts during unit tests do not protect some valid program state, they are simply a means to test that a function is operating as designed. A unit test should test one thing, maybe repeated times, and then exit. It should not save any state or affect any other unit tests or the program.

If there is ever an effort to prevent assert from running finally/scope blocks, special effort should be take to continue running those blocks during unit tests.

-Steve

Reply via email to