From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,36d61bbd5bb05d97 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2002-10-10 14:01:46 PST Newsgroups: comp.lang.ada Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newspeer.radix.net!uunet!ash.uu.net!world!news From: Robert A Duff Subject: Re: Question about subtype of loop index variable User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 Sender: news@world.std.com (Mr Usenet Himself) Message-ID: Date: Thu, 10 Oct 2002 21:01:10 GMT Content-Type: text/plain; charset=us-ascii References: <3DA5CF6D.C703306F@cadence.com> NNTP-Posting-Host: shell01.theworld.com Mime-Version: 1.0 Organization: The World Public Access UNIX, Brookline, MA Xref: archiver1.google.com comp.lang.ada:29694 Date: 2002-10-10T21:01:10+00:00 List-Id: Paul Graham writes: > I have a question about the type and subtype of a loop index variable. > I'll just > give an example: > > 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. Right. (Or, more precisely: T1 is a "first subtype", and the type of I is the type of T1. Types themselves never have names in Ada -- we informally refer to them by the name of their first subtype, but strictly speaking the name in a type declaration names a subtype. Strange, but true.) The subtype of I is "T1'Base range X'First - 1 .. X'Last + 1". The implementation gets to choose the bounds of T1'Base, but the bounds must include 0..7, and must be symmetric about zero (or symmetric but for an extra negative value). So the smallest range that T1'Base could have is -7..7. So the "X'Last + 1" *could* raise C_E. However, compilers normally choose the base range to match some hardware registers. So the base range is likely one of -128..127, or -2**31..2**31-1, or some such. So the above is unlikely to raise C_E. >... 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. The subtype of I comes from the bounds given, so the assignments into I can never raise C_E. The only possible C_E comes from the "X'Last + 1", and as I said, that's unlikely. If you want to be sure, do this: type T0 is range 0..8; subtype T1 is T0 range 0..7; Now you're guaranteed that T1'Base is -8..8 (or bigger). - Bob