Ada subtypes and base types

Robert Dewar dewar@adacore.com
Tue Feb 21 19:35:00 GMT 2006


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)



More information about the Gcc mailing list