DIP 1006 - Preliminary Review Round 1
Timon Gehr
timon.gehr at gmx.ch
Mon Mar 5 19:56:26 UTC 2018
On 05.03.2018 20:41, Iain Buclaw wrote:
> On Monday, 5 March 2018 at 15:48:12 UTC, Timon Gehr wrote:
>>
>> - Using existing assertions as compiler hints is not necessary.
>> (Without having checked it, I'm sure that LDC/GDC have a more suitable
>> intrinsic for this already.)
>>
>> As far as I can discern, forcing disabled asserts to give compiler
>> hints has no upsides.
>>
>
>
> In the simple cases, or in anything that looks like a
> unittest/testsuite, probably not.
>
> There are likely going to be more aggressive optimizations however if
> CFA can see that a variable will never be outside a given range, i.e:
> ...
(Note that by "forcing", I mean withholding other options from the user.
I'm not saying that using information from asserts can never be useful,
just that it can just as well be harmful, and therefore it is unwise to
not allow disabling them. I was saying that there are no upsides to not
having a flag that actually removes assertions.)
> ---
> int[5] arr;
>
> if (len < 0 || len >= 5)
> {
> unreachable(); // in non-release code, this would throw a RangeError.
> }
>
> return arr[len];
> ---
>
> From this, we aggressively assume that len is a valid index of arr.
> Something that happens in optimized non-release builds, but in release
> builds we must accommodate for the possibility of a range error.
I think this particular case is a bit less questionable than doing the
same for general assertions (for instance, in @safe code, -release will
not actually remove the bounds check unless there is some relevant
assertion somewhere). In any case, I don't argue strongly against a flag
that turns all assertions into compiler hints, I just think there should
also be a flag that disables them safely. Also, maybe -release should
commit to either disregarding @safe completely or respecting it completely.
More information about the Digitalmars-d
mailing list