checkedint call removal

John Colvin via Digitalmars-d digitalmars-d at puremagic.com
Wed Jul 30 09:28:57 PDT 2014


On Wednesday, 30 July 2014 at 16:25:41 UTC, John Colvin wrote:
> On Wednesday, 30 July 2014 at 15:49:33 UTC, Daniel Murphy wrote:
>> "Tofu Ninja"  wrote in message 
>> news:dtjqnyucskwnqjvksawg at forum.dlang.org...
>>
>>> Question?
>>> If an if condition throws or returns in its body is it ok for 
>>> the optimizer to 'assume' that the condition is false after 
>>> and make optimizations for it? If so then every one 
>>> complaining that assert gets removed in -release should 
>>> really just be using enforce.
>>
>> Yes.  In fact, it's required that an optimizer do this in 
>> order not to be considered garbage.
>>
>>> The possibility for the optimizer to make the same 
>>> optimizations for assert can be done for enforce, the only 
>>> difference is that it does not get removed in -release....
>>
>> Not quite.  With enforce, it is impossible (ignoring hardware 
>> or optimizer errors) for the condition to be false if the 
>> enforce was not triggered. Because the assert is not checked, 
>> the condition could be false and the code could do something 
>> awful.
>>
>> Also, the optimizer can only use the enforce's assumption 
>> _after_ it has checked the condition.  Since with assert it 
>> doesn't need to check, it can go backwards and assume the 
>> previous code will never produce a value that can violate the 
>> assertion.
>>
>> if (y > 7) // x can't possibly be >= 5, so this can't be true
>> x = y + 1;
>> assert(x < 5);
>>
>> if (y > 7) // the program will throw if >= 5, but that doesn't 
>> mean it can't be true
>> x = y + 1;
>> enforce(x < 5);
>>
>> Assert is much much more powerful.
>
> So what is the recommended way of inserting a check of the sort 
> that Ola would like?
>
> debug enforce(expr);
>
> perhaps? Seeing as that statement is completely missing outside 
> of debug mode, the compiler can't do anything much about it.
>
>
> P.S. What about version(assert)? Could the optimiser work with 
> this:
>
> if(x > 7) x++;
> version(assert) auto testResult = x;
> assert(x <= 7);

ugh, I made a mess of that one. Should be

if(x > 7) x++;
version(assert) auto testResult = x;
assert(testResult <= 7);


More information about the Digitalmars-d mailing list