# 3.6.1 Index Constraints and Discrete Ranges

1
An index_constraint determines the range of possible values for every index of an array subtype, and thereby the corresponding array bounds.

#### Syntax

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.
4.a
Discussion: In Ada 95, index_constraints only appear in a subtype_indication; they no longer appear in constrained_array_definitions.

#### 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.
7.a
Ramification: There is no need to define compatibility with a constrained array subtype, because one is not allowed to constrain it again.
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.
NOTES
9
48  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
49  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 Ada 2005 and 2012 Editions sponsored in part by Ada-Europe