Go to the first, previous, next, last section, table of contents.
-
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.
Syntax
-
extension_aggregate ::=
(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.
Legality Rules
-
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 extensions).
Static Semantics
-
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.
Dynamic Semantics
-
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.
NOTES
-
(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 section 7.6 User-Defined Assignment and Finalization.
Examples
-
Examples of extension aggregates (for types defined in See section 3.9.1 Type Extensions.):
-
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
Go to the first, previous, next, last section, table of contents.