Ada Reference Manual (Ada 2022) — Legal Information

# 3.8 Record Types

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.

#### Syntax

2
record_type_definition ::= [[abstract] tagged] [limited] record_definition
3/5
record_definition ::=
record
component_list
end record [record_identifier]
| null record
4
component_list ::=
component_item {component_item}
| {component_item} variant_part
| null;
5/1
component_item ::= component_declaration | aspect_clause
6/3
component_declaration ::=
defining_identifier_list : component_definition [:= default_expression]
[aspect_specification];
6.1/5
If a record_identifier appears at the end of the record_definition, it shall repeat the defining_identifier of the enclosing full_type_declaration.

#### 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/2
This paragraph was deleted.
9/2
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/3
A name that denotes any component, protected subprogram, or entry is allowed within an aspect_specification, an operational item, or a representation item that occurs within the declaration of the composite type.
12/3
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

13.1/3
If a record_type_definition includes the reserved word limited, the type is called an explicitly limited record type.
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/2
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 or range being defined is called a per-object constraint. For the elaboration of a component_definition of a component_declaration or the discrete_subtype_definition of an entry_declaration for an entry family (see 9.5.2), if the component subtype is defined by an access_definition or if the constraint or range of the subtype_indication or discrete_subtype_definition is not a per-object constraint, then the access_definition, subtype_indication, or discrete_subtype_definition is elaborated. On the other hand, if the constraint or range 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. Each such expression is evaluated once unless it is part of a named association in a discriminant constraint, in which case it is evaluated once for each associated discriminant.
18.1/1
When a per-object constraint is elaborated (as part of creating an object), each per-object expression of the constraint is evaluated. For other expressions, the values determined during the elaboration of the component_definition or entry_declaration are used. Any checks associated with the enclosing subtype_indication or discrete_subtype_definition are performed, including the subtype compatibility check (see 3.2.2), and the associated subtype is created.
19
NOTE 1 A component_declaration with several identifiers is equivalent to a sequence of single component_declarations, as explained in 3.3.1.
20
NOTE 2 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
NOTE 3 The subtype defined by a component_definition (see 3.6) has to be a definite subtype.
22
NOTE 4 If a record type does not have a variant_part, then the same components are present in all values of the type.
23
NOTE 5 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
NOTE 6 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/2
NOTE 7 A component of a record can be named with a selected_component. A value of a record can be specified with a record_aggregate.

#### Examples

26
Examples of record type declarations:
27/5
type Date is
record
Day : Integer range 1 .. 31;
Month : Month_Name; -- see 3.5.1
Year : Integer range 0 .. 4000;
end record;
28/5
type Complex is
record
Re : Real := 0.0;
Im : Real := 0.0;
end record Complex;
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

Ada 2005 and 2012 Editions sponsored in part by Ada-Europe