comp.lang.ada
 help / color / mirror / Atom feed
From: Jeffrey Carter <jrcarter@acm.org>
Subject: Re: Question about subtype of loop index variable
Date: Thu, 10 Oct 2002 20:09:25 GMT
Date: 2002-10-10T20:09:25+00:00	[thread overview]
Message-ID: <3DA5DE58.4030105@acm.org> (raw)
In-Reply-To: 3DA5CF6D.C703306F@cadence.com

Paul Graham wrote:
> with Text_Io; use Text_Io;
> procedure Test_Range is
>    package Int_Io is new Integer_Io(Integer); use Int_Io;
>    type T1 is range 0 .. 7;
>    type T2 is array(T1 range <>) of Integer;
>    X : T2(0 .. 3);
>    Y : Integer;
> begin
>    Y := 0;
>    for I in X'First - 1 .. X'Last + 1 loop
>       Y := Y + 1;
>    end loop;
>    Put("Y = ");
>    Put(Y);
>    New_Line;
> end;
> 
> My question is, what is the type (and subtype) of loop index I?  Since
> the
> expressions X'First - 1 and X'Last + 1 are of type T1, then
> I is also of type T1.  But the values X'First - 1 and X'Last + 1 lie
> outside
> the bounds of T1, so I would think that a range constraint error would
> occur
> as I is assigned these values.  Yet gnat 3.13 compiles and executes this
> code 
> without error.  Am I misunderstanding something?

I think so. The expressions X'First - 1 and X'Last + 1 are evaluated 
using the base type of the subtype. In this case the subtype is T1, 
because types are always anonymous and the name in a type statement is 
the "first named subtype". The base type of T1 is T1'Base. T1'Base has a 
range of at least -7 .. 7 because signed integer types are symmetric 
about 0 but may have an additional negative value. The compiler almost 
certainly used an 8-bit base type here, so the real range is probably 
-128 .. 127; you can check by printing out T1'Base'First and T1'Base'Last.

Of course, it would be easier and quicker to calculate Y as

Y := X'Length + 2;

-- 
Jeff Carter
"You've got the brain of a four-year-old boy,
and I bet he was glad to get rid of it."
Horse Feathers




  reply	other threads:[~2002-10-10 20:09 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-10-10 19:05 Question about subtype of loop index variable Paul Graham
2002-10-10 20:09 ` Jeffrey Carter [this message]
2002-10-10 21:01 ` Robert A Duff
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox