Go to the first, previous, next, last section, table of contents.
-
A record object is a composite object consisting of named components.
The value of a record object is a composite value consisting of the
values of the components.
Syntax
-
record_type_definition ::=
[[abstract] tagged] [limited] record_definition
-
record_definition ::=
record
component_list
end record
| null record
-
component_list ::=
component_item {component_item}
| {component_item} variant_part
| null;
-
component_item ::= component_declaration | representation_clause
-
component_declaration ::=
defining_identifier_list : component_definition
[:= default_expression];
Name Resolution Rules
-
The expected type for the default_expression, if any, in a
component_declaration is the type of the component.
Legality Rules
-
A default_expression is not permitted if the component is of a limited
type.
-
Each component_declaration declares a component of the record type.
Besides components declared by component_declarations, the components of
a record type include any components declared by
discriminant_specifications of the record type declaration. The
identifiers of all components of a record type shall be distinct.
-
Within a type_declaration, a name that denotes a component, protected
subprogram, or entry of the type is allowed only in the following cases:
-
A name that denotes any component, protected subprogram, or entry is
allowed within a representation item that occurs within the declaration
of the composite type.
-
A name that denotes a noninherited discriminant is allowed within the
declaration of the type, but not within the discriminant_part. If the
discriminant is used to define the constraint of a component, the bounds
of an entry family, or the constraint of the parent subtype in a
derived_type_definition then its name shall appear alone as a
direct_name (not as part of a larger expression or expanded name). A
discriminant shall not be used to define the constraint of a scalar
component.
-
If the name of the current instance of a type, See section 8.6 The Context of Overload Resolution, is used to
define the constraint of a component, then it shall appear as a
direct_name that is the prefix of an attribute_reference whose result is
of an access type, and the attribute_reference shall appear alone.
Static Semantics
-
The component_definition of a component_declaration defines the
(nominal) subtype of the component. If the reserved word aliased appears
in the component_definition, then the component is aliased, See section 3.10 Access Types.
-
If the component_list of a record type is defined by the reserved word
null and there are no discriminants, then the record type has no
components and all records of the type are null records. A
record_definition of null record is equivalent to record null; end
record.
Dynamic Semantics
-
The elaboration of a record_type_definition creates the record type and
its first subtype, and consists of the elaboration of the
record_definition. The elaboration of a record_definition consists of
the elaboration of its component_list, if any.
-
The elaboration of a component_list consists of the elaboration of the
component_items and variant_part, if any, in the order in which they
appear. The elaboration of a component_declaration consists of the
elaboration of the component_definition.
-
Within the definition of a composite type, if a component_definition or
discrete_subtype_definition, See section 9.5.2 Entries and Accept Statements, includes a name that denotes
a discriminant of the type, or that is an attribute_reference whose
prefix denotes the current instance of the type, the expression
containing the name is called a per-object expression, and the
constraint being defined is called a per-object constraint. For the
elaboration of a component_definition of a component_declaration, if the
constraint of the subtype_indication is not a per-object constraint,
then the subtype_indication is elaborated. On the other hand, if the
constraint is a per-object constraint, then the elaboration consists of
the evaluation of any included expression that is not part of a
per-object expression.
NOTES
-
(55) A component_declaration with several identifiers is equivalent to a
sequence of single component_declarations, as explained in See section 3.3.1 Object Declarations.
-
(56) The default_expression of a record component is only evaluated upon
the creation of a default-initialized object of the record type
(presuming the object has the component, if it is in a variant_part --
See section 3.3.1 Object Declarations.).
-
(57) The subtype defined by a component_definition, See section 3.6 Array Types, has to
be a definite subtype.
-
(58) If a record type does not have a variant_part, then the same
components are present in all values of the type.
-
(59) A record type is limited if it has the reserved word limited in its
definition, or if any of its components are limited, See section 7.5 Limited Types.
-
(60) The predefined operations of a record type include membership
tests, qualification, and explicit conversion. If the record type is
nonlimited, they also include assignment and the predefined equality
operators.
-
(61) A component of a record can be named with a selected_component. A
value of a record can be specified with a record_aggregate, unless the
record type is limited.
Examples
-
Examples of record type declarations:
-
type Date is
record
Day : Integer range 1 .. 31;
Month : Month_Name;
Year : Integer range 0 .. 4000;
end record;
-
type Complex is
record
Re : Real := 0.0;
Im : Real := 0.0;
end record;
-
Examples of record variables:
-
Tomorrow, Yesterday : Date;
A, B, C : Complex;
-
-- both components of A, B, and C are implicitly initialized to zero
- 3.8.1: Variant Parts and Discrete Choices
Go to the first, previous, next, last section, table of contents.