Jeffrey A Law wrote:
So, if we have an object with the range based on its type of [0, 0x7fffffff] and we add 1 to that object, the resulting range should be [1, 0x7fffffff]. ie, 0x80000000 is not a valid value for the type. Right?
The actual rule in Ada works like this: type X is range 0 .. 16#7fff_ffff#; Y : X; Y := (Y + 1) - 1; If Y is X'Last, then the addition of 1 must either raise an overflow exception or "work". Works means give its proper mathematical value. So this assignment can either raise CE, or leave Y unchanged. Either is OK. If checks are off, then it is probably better to just let the addition wrap (in fact it seems pretty clear that Ada would be better off enabling -fwrapv)