comp.lang.ada
 help / color / mirror / Atom feed
From: cis.ohio-state.edu!zaphod.mps.ohio-state.edu!rpi!bu.edu!inmet!stt@ucbvax.
Subject: Re: Untyped "constant"?
Date: 27 Sep 91 14:13:00 GMT	[thread overview]
Message-ID: <20600118@inmet> (raw)

Re: Untyped "constant"? by gralia@ddsdx2.jhuapl.edu

> I have a question about Ada.  It has to do with "named numbers" and 
> their subsequent use.
> 
> a) Suppose I have a compiler/RTE in which integer'last is 32_767.
> b) And suppose the system has a long_integer type in which
>    long_integer'last = 2_147_483_647.
> c) And suppose I have the program:
>           procedure Named1 is
>              X : constant := integer'last+5;

This is not legal Ada, since the type of integer'last+5 is integer,
not universal-integer.  This can be made legal as follows:

               X : constant := Integer'POS(Integer'LAST) + 5;

This works because int-type'POS returns the value of its operand
converted to univ-integer type.

>           begin
>               for j in 1..X loop

This will not work in general, because when both bounds can
be interpreted as universal integer (as above), the 
type of J will be STANDARD.INTEGER.  Therefore, you should
get CONSTRAINT_ERROR on this line.

>                   null;
>               end loop;
>           end Named1;
> 
> d) Finally, suppose the "loop" variables are really used. E.g., by
>    disabling optimization when I invoke the compiler.  
> 
> 
> Then:  is this a legal program or not?

No, it is not legal as written (see above for correction).

> Thanks,
> Mars Gralia
> 
> 
> 
> DISCUSSION
> 
> Some compilers, admittedly archaic or for very small computers, 
> will raise a Constraint_Error, thereby forcing me to say:
>              X : constant long_integer := integer'last+5;

This is also illegal, because, again, the type on the right
is Integer, not Long_Integer.  It could be made legal as follows:

              X : constant Long_Integer := Long_Integer(Integer'LAST) + 5;

In any case, *all* compilers should raise CONSTRAINT_ERROR
if you say "for J in 1..X" when X is a universal-integer > Integer'LAST.

By the way, "X : constant := ..." must *never* raise constraint error
on the assigment, though some subexpression on the right hand side
might raise constraint error, presuming it is inside a 'POS (as above).
All static univ-integer calculations must be performed to arbitrary
range (no overflow allowed).

> I would prefer the program given above, because it would appear to be 
> more portable.

By using 'POS, you can make the declaration of X work without
constraint error, but you will still get a constraint error
on the loop unless you specify a type for J that includes
the low and high bound.  Furthermore, there exist compilers where 
Integer'LAST is equal to SYSTEM.MAX_INT, and in that case
you are out of luck.

S. Tucker Taft    stt@inmet.inmet.com
Intermetrics, Inc.
Cambridge, MA  01238

             reply	other threads:[~1991-09-27 14:13 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1991-09-27 14:13 cis.ohio-state.edu!zaphod.mps.ohio-state.edu!rpi!bu.edu!inmet!stt [this message]
  -- strict thread matches above, loose matches on Subject: below --
1991-09-24 21:22 Untyped "constant"? Norman H . Cohen
1991-09-24 15:08 John Goodenough
1991-09-23 17:32 agate!spool.mu.edu!caen!uakari.primate.wisc.edu!aplcen!ddsdx2.jhuapl.edu!
1991-09-23 16:44 cis.ohio-state.edu!zaphod.mps.ohio-state.edu!uakari.primate.wisc.edu!aplc
replies disabled

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