- (1)
- A discriminant_constraint specifies the values of the discriminants for a
given discriminated type.
(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)
- 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.
- (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
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12