On Tuesday, 5 June 2018 at 08:12:54 UTC, Shachar Shemesh wrote:
I set up to find out what happens if the assert string throws. I have to admit I did not expect the result:

$ cat test.d
import std.stdio;
import core.exception;

void main() {
    scope(failure) {
        writeln("Not gonna happen");
    }

    try {
        static string throwingFunc() {
            throw new Exception("An exception");
        }
        assert(0==1, throwingFunc());
    } catch(Exception ex) {
        writeln("Exception");
    } catch(AssertError ex) {
        writeln("Assert");
    }
}

$ ldc2 --version
LDC - the LLVM D compiler (1.8.0):
  based on DMD v2.078.3 and LLVM 5.0.1
...

$ ./test
Not gonna happen
object.Exception@test.d(11): An exception

applying a bit of lowering

int Dmain (int arc, const char** argv)
{
    try return main();
    catch (...) dumpThrowable(); // 3 dumps exception
}
void main() {
    try {
        try {
             static string throwingFunc() {
                throw new Exception("An exception");
            }
__assert_fail(throwingFunc(),...); // 1 throws before assert throws
            } catch(Exception ex) {
writeln("Exception"); // Why is this not caught? I've no idea
           } catch(AssertError ex) {
writeln("Assert"); // this is not caught because the thrown throwable is not an exception
          }
     }
     catch(...)
     {
        writeln("Not gonna happen"); // 2 scope failure is run
          throw;
     }

}

Reply via email to