checkedint call removal
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jul 29 03:40:32 PDT 2014
On Tuesday, 29 July 2014 at 09:40:27 UTC, Marc Schütz wrote:
> On Monday, 28 July 2014 at 15:52:23 UTC, John Colvin wrote:
>> On Monday, 28 July 2014 at 15:20:44 UTC, Ola Fosheim Grøstad
>> wrote:
>>> If asserts were used as optimization constraints
>>
>> all available code is fair game as optimisation constraints.
>> What you are asking for is a special case for `assert` such
>> that the optimiser is blind to it.
>>
>> bool foo(int a)
>> {
>> //let's handwrite a simple assert
>> if(a >= 0)
>> {
>> exit(EXIT_FAILURE);
>> }
>> //and then do something.
>> return a < 0;
>> }
>>
>> Of course the compiler is free to rewrite that as
>>
>> bool foo(int a)
>> {
>> if(a >= 0)
>> {
>> exit(EXIT_FAILURE);
>> }
>> return true;
>> }
>>
>> Why should the situation be different if I use the builtin
>> `assert` instead?
>
> The problem is that in release mode, the asserts are removed.
> It would then be a very big mistake to still take them into
> account for optimizations, as if they were actually there.
>
> To take your code:
>
> assert(a >= 0);
> return a < 0;
>
> is equivalent to
>
> assert(a >= 0);
> return true;
>
> but only in non-release mode. In release mode, this effectively
> becomes
>
> return a < 0;
>
> which is _not_ equivalent to
>
> return true;
>
> I believe this is was Ola is protesting about, and I agree with
> him. Such optimizations must only happen if the check stays.
you mean assert(a < 0) or assert(!(a >= 0)) right?
In a correct program (a necessary but not sufficient condition
for which is to not violate it's asserts) it is the same.
The program is in error if a > 0, whether the assert is compiled
in or not. Running in debug mode can simply mean "check my
assumptions".
More information about the Digitalmars-d
mailing list