www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - assert(false, "...") doesn't terminate program?!

I'm investigating issue 8021, and found a strange problem in std.bigint.
Somehow, checkDivByZero is getting called, and isZero correctly detects
a zero denominator, YET the assert passes, and the integer division by
zero doesn't trigger any division by zero signal.

Here's the test case from the bugtracker:

	import std.stdio, std.bigint;

	void main() {
	    BigInt n = BigInt(2) / BigInt(0);

Here's the instrumented Phobos code to show this strange effect (this is
inside struct BigInt, I modified the code to show exactly what the code
is doing, it's pretty strange):

    // Generate a runtime error if division by zero occurs
    //void checkDivByZero() pure const
    void checkDivByZero() const
        import std.stdio;
        writeln(isZero());	// prints true
        writeln(!isZero());	// prints false

	// this should assert, but doesn't?!
        assert(!isZero(), "BigInt division by zero");

        writeln("how did the assert not trigger??!!");	// how did we get here?!

        if (isZero()) {
            auto x = 1/toInt(); // generate a div by zero error

	    // ... or not?
            writeln("div by zero was not triggered!!");
            writeln(toInt());	// prints 0
            assert(0);          // segfaults??!



	how did the assert not trigger??!!
	div by zero was not triggered!!
	Segmentation fault

It's beyond my imagination how assert(!isZero()) could possibly have
continued execution when isZero() is clearly true and !isZero() is
clearly false. What's going on here??


Tell me and I forget. Teach me and I remember. Involve me and I understand. --
Benjamin Franklin
Oct 27 2012