comp.lang.ada
 help / color / mirror / Atom feed
* null ranges and index constraints (was constraint error question)
@ 1990-11-13  2:58 Alex Blakemore
  1990-11-13 18:22 ` Tom Gargulak
  0 siblings, 1 reply; 2+ messages in thread
From: Alex Blakemore @ 1990-11-13  2:58 UTC (permalink / raw)



  I asked Norm Cohen to explain why the null range in his fix to my 
earlier problem (constraint error question for language lawyers).
I was surprised that declaring an array with a null range that
did not match the constraints of the index subtype of the array
did not raise constraint_error.  This was his reply.
I am posting it because it may be of interest to others.

                                        Alex Blakemore

and here's Norm ...

---------------------------

Bounds of a null range ARE allowed to be outside the corresponding
index subtype, as in String(1 .. 0).  It's hard to explain this just
by citing RM paragraph numbers; I have to quote a few sentences.
For each kind of constraint, the RM gives rules explaining when the
constraint is "compatible" with the type mark it follows.  Compatibility
is checked at run time, when a subtype indication is elaborated
(see RM 3.3.2(8)).  The rule for compatibility of an index constraint
with a type mark denoting an array type, given in 3.6.1(4), is given in
terms of a rule presented earlier, in 3.5(4), for compatibility of a
range constraint with a type mark denoting a discrete type.

RM 3.6.1(4) states,

   An index constraint is _compatible_ with the type denoted by the
   type mark if and only if the constraint defined by each discrete
   range is compatible with the corresponding index subtype.

RM 3.5(4) states,

   A range constraint is _compatible_ with a subtype if each bound of
   the range belongs to the subtype, or if the range constraint
   defines a null range; otherwise the range constraint is not
   compatible with the subtype.

For example, given the declarations

   type Short is range 0 .. 10;
   type Positive_Short is Short range 1 .. Short'Last;
   type Short_String is array (Positive_Short range <>) of Character;
   SS : Short_String (1 .. 0);

3.6.1(4) tells us that the index constraint (1 .. 0) is compatible with
the type mark Short_String if and only if the range constraint 1 .. 0
is compatible with the subtype Positive_Short.  3.5(4) says that the
range constraint 1 .. 0 is compatible with Positive_Short (even though
the upper bound of the range does not belong to the subtype) because
the range constraint defines a null range.

Unfortunately, this is not quite the same as saying that "all null
ranges are the same."  Try the following program:
- - - - - - - - - - - - - -(cut here)- - - - - - - - - - - - - - - - - -
procedure All_Null_Ranges_Are_Not_The_Same is
   type Short is range 0 .. 10;
   subtype Positive_Short is Short range 1 .. Short'Last;
   type Short_String is array (Positive_Short range <>) of Character;
   type Short_String_In_A_Record (Length: Short) is
      record
         C : Short_String (1 .. Length);
      end record;
   Null_String : Short_String (0 .. -1);
   SSR : Short_String_In_A_Record (Length => 0);
begin
   SSR := (Length => 0, C => Null_String);
   -- Raises Constraint_Error because the constraint on SSR.C is 1 .. 0 but
   --   the constraint on Null_String is 0 .. -1.  Both are legitimate null
   --   ranges, but they are not the SAME null range!
end All_Null_Ranges_Are_Not_The_Same;

----------------------------------------------------------------------
Alex Blakemore                       blakemore@software.org
Software Productivity Consortium
2214 Rock Hill Road Herndon, VA 22070 (703) 742-7125

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: null ranges and index constraints (was constraint error question)
  1990-11-13  2:58 null ranges and index constraints (was constraint error question) Alex Blakemore
@ 1990-11-13 18:22 ` Tom Gargulak
  0 siblings, 0 replies; 2+ messages in thread
From: Tom Gargulak @ 1990-11-13 18:22 UTC (permalink / raw)


One thing I failed to mention.  I assume that the program will raise
a storage_error exception due to the infinite recursion.  I realize
some compilers can optimize this into a loop.

So, assuming the exception occurs, will this program eventually 
terminate?  Why?

Thanks again,

Tom 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1990-11-13 18:22 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1990-11-13  2:58 null ranges and index constraints (was constraint error question) Alex Blakemore
1990-11-13 18:22 ` Tom Gargulak

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