Contents Index Search Previous Next
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/1
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 a general access subtype, a discriminant_constraint
is illegal if there is a place within the immediate scope of the designated
subtype where the designated subtype's view is constrained.
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.
13
54 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
Contents Index Search Previous Next Legal