4.3.1 Record Aggregates
In a record_aggregate
a value is specified for each component of the record or record extension
value, using either a named or a positional association.
Name Resolution Rules
The expected type for a record_aggregate
shall be a single record type or record extension.
- For a positional association, the
component (including possibly a discriminant) in the corresponding relative
position (in the declarative region of the type), counting only the needed
- For a named association with one or
the named component(s);
- For a named association with the reserved
word others, all needed components that are not associated with
some previous association.
If the type of a record_aggregate
is a record extension, then it shall be a descendant of a record type,
through one or more record extensions (and no private extensions).
If the components of a variant_part
are needed, then the value of a discriminant that governs the variant_part
shall be given by a static expression.
For the evaluation of a record_component_association_list
any per-object constraints (see 3.8
) for components
specified in the association list are elaborated and any expression
are evaluated and converted to the subtype of the associated component.
Any constraint elaborations and expression
evaluations (and conversions) occur in an arbitrary order, except that
for a discriminant is evaluated (and converted) prior to the elaboration
of any per-object constraint that depends on it, which in turn occurs
prior to the evaluation and conversion of the expression
for the component with the per-object constraint.
Example of a record
aggregate with positional associations:
(4, July, 1776) -- see 3.8
Examples of record
aggregates with named associations:
(Day => 4, Month => July, Year => 1776)
(Month => July, Day => 4, Year => 1776)
(Disk, Closed, Track => 5, Cylinder => 12) -- see 3.8.1
(Unit => Disk, Status => Closed, Cylinder => 9, Track => 1)
Examples of component
associations with several choices:
(Value => 0, Succ|Pred => new
)) -- see 3.10.1
-- The allocator is evaluated twice: Succ and Pred designate different cells
(Value => 0, Succ|Pred => <>) -- see 3.10.1
-- Succ and Pred will be set to null
Examples of record
aggregates for tagged types (see 3.9 and 3.9.1):
Literal'(Value => 0.0)
Painted_Point'(0.0, Pi/2.0, Paint => Red)