3.7.1 Discriminant Constraints
Syntax
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.
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. However, in the case of an access subtype, a 
discriminant_constraint 
is legal only if any dereference of a value of the access type is known 
to be constrained (see 
3.3). 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.
This paragraph was 
deleted.
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 
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. 
62  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 subclause 3.7): 
 
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
 Ada 2005 and 2012 Editions sponsored in part by Ada-Europe
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe