- (1)
- An index_constraint determines the range of possible values for every
index of an array subtype, and thereby the corresponding array bounds.
(2)
       index_constraint ::=  (discrete_range {, discrete_range})
(3)
       discrete_range ::= discrete_subtype_indication | range
Name Resolution Rules
- (4)
- The type of a discrete_range is the type of the subtype defined by the
subtype_indication, or the type of the range.  For an index_constraint, each
discrete_range shall resolve to be of the type of the corresponding index.
Legality Rules
- (5)
- An index_constraint shall appear only in a subtype_indication whose
subtype_mark denotes either an unconstrained array subtype, or an
unconstrained access subtype whose designated subtype is an unconstrained
array subtype; in either case, the index_constraint shall provide a discrete_range for each index of the array type.
Static Semantics
- (6)
- A discrete_range defines a range whose bounds are given by the range, or
by the range of the subtype defined by the subtype_indication.
Dynamic Semantics
- (7)
  
- An index_constraint is compatible with an unconstrained array subtype if 
    and only if the index range defined by each discrete_range is compatible (see 
    3.5) with the corresponding index subtype. If any of the discrete_ranges 
    defines a null range, any array thus constrained is a null array, having no 
    components. An array value satisfies an index_constraint if at each index 
    position the array value and the index_constraint have the same index bounds. 
  
- (8)
- The elaboration of an index_constraint consists of the evaluation of the
discrete_range(s), in an arbitrary order.  The evaluation of a discrete_range
consists of the elaboration of the subtype_indication or the evaluation of
the range.
- 
- (9)
- 
      (43) The elaboration of a subtype_indication consisting of a subtype_mark 
      followed by an index_constraint checks the compatibility of the index_constraint 
      with the subtype_mark (see 3.2.2). 
     
- (10)
- 
      (44) Even if an array value does not satisfy the index constraint of an 
      array subtype, Constraint_Error is not raised on conversion to the array 
      subtype, so long as the length of each dimension of the array value and 
      the array subtype match. See 4.6. 
     
Examples
- (11)
- Examples of array declarations including an index constraint:
(12)
       Board     : Matrix(1 .. 8,  1 .. 8);  --  see 3.6
       Rectangle : Matrix(1 .. 20, 1 .. 30);
       Inverse   : Matrix(1 .. N,  1 .. N);  --  N need not be static
(13)
       Filter    : Bit_Vector(0 .. 31);
- (14)
- Example of array declaration with a constrained array subtype:
(15)
       My_Schedule : Schedule;  --  all arrays of type Schedule have the same bounds
- (16)
- Example of record type with a component that is an array:
(17)
       type Var_Line(Length : Natural) is
          record
             Image : String(1 .. Length);
          end record;
(18)
       Null_Line : Var_Line(0);  --  Null_Line.Image is a null array
  -- Email comments, additions, corrections, gripes, kudos, etc. to:
 
  -- Email comments, additions, corrections, gripes, kudos, etc. to: 
 Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12