 (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:
Magnus Kempe  Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 950312