- An extension_aggregate specifies a value for a type that is a record
extension by specifying a value or subtype for an ancestor of the type,
followed by associations for any components not determined by the ancestor_part.
(ancestor_part with record_component_association_list)
ancestor_part ::= expression | subtype_mark
Name Resolution Rules
- The expected type for an extension_aggregate shall be a single nonlimited
type that is a record extension. If the ancestor_part is an expression, it
is expected to be of any nonlimited tagged type.
- If the ancestor_part is a subtype_mark, it shall denote a specific tagged
subtype. The type of the extension_aggregate shall be derived from the type
of the ancestor_part, through one or more record extensions (and no private
- For the record_component_association_list of an extension_aggregate, the
only components needed are those of the composite value defined by the
aggregate that are not inherited from the type of the ancestor_part, plus any
inherited discriminants if the ancestor_part is a subtype_mark that denotes
an unconstrained subtype.
- For the evaluation of an extension_aggregate, the record_component_association_list is evaluated. If the ancestor_part is an expression, it is
also evaluated; if the ancestor_part is a subtype_mark, the components of the
value of the aggregate not given by the record_component_association_list are
initialized by default as for an object of the ancestor type. Any implicit
initializations or evaluations are performed in an arbitrary order, except
that the expression for a discriminant is evaluated prior to any other
evaluation or initialization that depends on it.
- If the type of the ancestor_part has discriminants that are not inherited
by the type of the extension_aggregate, then, unless the ancestor_part is a
subtype_mark that denotes an unconstrained subtype, a check is made that each
discriminant of the ancestor has the value specified for a corresponding
discriminant, either in the record_component_association_list, or in the
derived_type_definition for some ancestor of the type of the extension_aggregate. Constraint_Error is raised if this check fails.
(8) If all components of the value of the extension_aggregate are
determined by the ancestor_part, then the record_component_association_list is required to be simply null record.
(9) If the ancestor_part is a subtype_mark, then its type can be abstract.
If its type is controlled, then as the last step of evaluating the aggregate,
the Initialize procedure of the ancestor type is called, unless the Initialize
procedure is abstract (see 7.6).
- Examples of extension aggregates (for types defined in
Painted_Point'(Point with Red)
(Point'(P) with Paint => Black)
(Expression with Left => 1.2, Right => 3.4)
Addition'(Binop with null record)
-- presuming Binop is of type Binary_Operation
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Page last generated: 95-03-12