Discriminant Constraints
Author: JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor

Ada Reference Manual — Legal Information

# 3.7.1 Discriminant Constraints

1
A discriminant_constraint specifies the values of the discriminants for a given discriminated type.

#### Syntax

2
discriminant_constraint ::=
(discriminant_association {, discriminant_association})
3
discriminant_association ::=
[discriminant_ selector_name {| discriminant_ selector_name} =>] expression
4
A discriminant_association is said to be named if it has one or more discriminant_ selector_names; it is otherwise said to be positional. In a discriminant_constraint, any positional associations shall precede any named associations.

#### Name Resolution Rules

5
Each selector_name of a named discriminant_association shall resolve to denote a discriminant of the subtype being constrained; the discriminants so named are the associated discriminants of the named association. For a positional association, the associated discriminant is the one whose discriminant_specification occurred in the corresponding position in the known_discriminant_part that defined the discriminants of the subtype being constrained.
6
The expected type for the expression in a discriminant_association is that of the associated discriminant(s).

#### Legality Rules

7/2
A discriminant_constraint is only allowed in a subtype_indication whose subtype_mark denotes either an unconstrained discriminated subtype, or an unconstrained access subtype whose designated subtype is an unconstrained discriminated subtype. However, in the case of an access subtype, a discriminant_constraint is illegal if the designated type has a partial view that is constrained or, for a general access subtype, has default_expressions for its discriminants. In addition to the places where Legality Rules normally apply (see 12.3), these rules apply also in the private part of an instance of a generic unit. In a generic body, this rule is checked presuming all formal access types of the generic might be general access types, and all untagged discriminated formal types of the generic might have default_expressions for their discriminants.
8
A named discriminant_association with more than one selector_name is allowed only if the named discriminants are all of the same type. A discriminant_constraint shall provide exactly one value for each discriminant of the subtype being constrained.
9
The expression associated with an access discriminant shall be of a type convertible to the anonymous access type.

#### Dynamic Semantics

10
A discriminant_constraint is compatible with an unconstrained discriminated subtype if each discriminant value belongs to the subtype of the corresponding discriminant.
11
A composite value satisfies a discriminant constraint if and only if each discriminant of the composite value has the value imposed by the discriminant constraint.
12
For the elaboration of a discriminant_constraint, the expressions in the discriminant_associations are evaluated in an arbitrary order and converted to the type of the associated discriminant (which might raise Constraint_Error — see 4.6); the expression of a named association is evaluated (and converted) once for each associated discriminant. The result of each evaluation and conversion is the value imposed by the constraint for the associated discriminant.
NOTES
13
56 The rules of the language ensure that a discriminant of an object always has a value, either from explicit or implicit initialization.

#### Examples

14
Examples (using types declared above in clause 3.7):
15
Large : Buffer(200); -- constrained, always 200 characters
-- (explicit discriminant value)
Message : Buffer; -- unconstrained, initially 100 characters
-- (default discriminant value)
Basis : Square(5); -- constrained, always 5 by 5
Illegal : Square; -- illegal, a Square has to be constrained

Sponsored by Ada-Europe