On 29/10/12 18:38, Walter Bright wrote:
On 10/29/2012 7:51 AM, Don Clugston wrote:> On 27/10/12 20:39, H. S.
Teoh wrote:
 >> On Sat, Oct 27, 2012 at 08:26:21PM +0200, Andrej Mitrovic wrote:
 >>> On 10/27/12, H. S. Teoh <[email protected]> wrote:
 >>>>          writeln("how did the assert not trigger??!!");    // how
did we get
 >>>> here?!
 >>>
 >>> Maybe related to -release?
 >> [...]
 >>
 >> Haha, you're right, the assert is compiled out because of -release.
 >>
 >> But I disassembled the code, and didn't see the "auto x = 1/toInt()"
 >> either. Is the compiler optimizing that away?
 >
 > Yes, and I don't know on what basis it thinks it's legal to do that.

Because x is a dead assignment, and so the 1/ is removed.


Divide by 0 faults are not considered a side effect.

Ah, that's interesting, I didn't know that.



I think the code would be
better written as:

     if (toInt() == 0) throw new Error();

If you really must have a divide by zero fault,

     if (toInt() == 0) divideByZero();

where:

     void divideByZero()
     {
          static int x;
          *cast(int*)0 = x / 0;
     }

And that works because writes to 0 _are_ considered a side-effect?
Is that guaranteed to work?


Reply via email to