checkedint call removal
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Fri Aug 1 01:31:49 PDT 2014
On Friday, 1 August 2014 at 03:17:06 UTC, Walter Bright wrote:
>>> In fact, the whole reason assert is a core language feature
>>> rather than
>>> a library notion is I was anticipating making use of assert
>>> for
>>> optimization hints.
>>
>> So why is this not documented?
>
> Frankly, it never occurred to me that it wasn't obvious. When
> something is ASSERTED to be true, then it is available to the
> optimizer. After all, that is what optimizers do - rewrite code
> into a mathematically equivalent form that is provably the same
> (but cheaper to compute). Its inputs are things that are known
> to be true.
>
> For example, if a piece of code ASSERTS that x is 3, thereafter
> the optimizer knows that x must be 3. After all, if the
> optimizer encounters:
>
> x = 3;
>
> do I need to then add a note saying the optimizer can now make
> use of that fact afterwards? The use of "assert" is a very
> strong word, it is not "maybe" or "possibly" or "sometimes" or
> "sort of".
>
> When you write:
>
> assert(x == 3);
>
> then at that point, if x is not 3, then the program is
> irretrievably, irredeemably, undeniably broken, and the default
> action is that the program is terminated.
>
> The idea expressed here by more than one that this is not the
> case in their code is astonishing to me.
This is enough to convince me.
assert - in D - is for documenting assumptions and checking them
in non-release builds. It's a reasonable definition - if
unexpected to some - and allows good optimisation opportunities.
Do these guidelines sound reasonable:
Don't want the optimiser to use the information from your asserts
when the asserts are gone?
Wrap them in a version block and version them out in your release
builds. Write a wrapper for assert that does this if you like.
You could even write a no-op wrapper for assert and call it
assume, if you really want to.
Don't want your defensive checks to ever be removed from a
certain bit of code?
Use std.exception.enforce or, if you really insist on assert, put
a
version(assert) {} else
static assert(false, "Must be compiled with assertions
enabled");
in the relevant place to prevent people accidentally disabling
them.
More information about the Digitalmars-d
mailing list