- (1)
- 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.
(2)
record_type_definition ::= [[abstract] tagged] [limited] record_definition
(3)
record_definition ::=
record
component_list
end record
| null record
(4)
component_list ::=
component_item {component_item}
| {component_item} variant_part
| null;
(5)
component_item ::= component_declaration | representation_clause
(6)
component_declaration ::=
defining_identifier_list : component_definition [:= default_expression];
Name Resolution Rules
- (7)
- The expected type for the default_expression, if any, in a component_declaration is the type of the component.
Legality Rules
- (8)
- A default_expression is not permitted if the component is of a limited
type.
- (9)
- 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.
- (10)
- Within a type_declaration, a name that denotes a component, protected
subprogram, or entry of the type is allowed only in the following cases:
- (11)
- 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.
- (12)
- 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.
- (13)
- If the name of the current instance of a type (see 8.6)
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
- (14)
- 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 3.10).
- (15)
- 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
- (16)
- 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.
- (17)
- 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.
- (18)
- Within the definition of a composite type, if a component_definition or
discrete_subtype_definition (see 9.5.2) 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.
-
- (19)
(55) A component_declaration with several identifiers is equivalent to a
sequence of single component_declarations, as explained in
3.3.1.
- (20)
(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
3.3.1).
- (21)
(57) The subtype defined by a component_definition (see
3.6) has to be a definite subtype.
- (22)
(58) If a record type does not have a variant_part, then the same
components are present in all values of the type.
- (23)
(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
7.5).
- (24)
(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.
- (25)
(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
- (26)
- Examples of record type declarations:
(27)
type Date is
record
Day : Integer range 1 .. 31;
Month : Month_Name;
Year : Integer range 0 .. 4000;
end record;
(28)
type Complex is
record
Re : Real := 0.0;
Im : Real := 0.0;
end record;
- (29)
- Examples of record variables:
(30)
Tomorrow, Yesterday : Date;
A, B, C : Complex;
(31)
-- both components of A, B, and C are implicitly initialized to zero
Subclauses
- Variant Parts and Discrete Choices
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12