Go to the first, previous, next, last section, table of contents.

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

discriminant_constraint ::=
(discriminant_association {, discriminant_association})

discriminant_association ::=
[discriminant_selector_name
{ discriminant_selector_name} =>] expression

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

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.

The expected type for the expression in a discriminant_association is
that of the associated discriminant(s).
Legality Rules

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.

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.

The expression associated with an access discriminant shall be of a type
convertible to the anonymous access type.
Dynamic Semantics

A discriminant_constraint is compatible with an unconstrained
discriminated subtype if each discriminant value belongs to the subtype
of the corresponding discriminant.

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.

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 section 4.6 Type Conversions.); 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

(54) The rules of the language ensure that a discriminant of an object
always has a value, either from explicit or implicit initialization.
Examples

Examples (using types declared above in clause See section 3.7 Discriminants.):

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
Go to the first, previous, next, last section, table of contents.