Go to the first, previous, next, last section, table of contents.

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.


  2. record_type_definition ::=
       [[abstract] tagged] [limited] record_definition
  3. record_definition ::=
         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:
    1. 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.
    2. 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.

  1. 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

  2. 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.
  3. 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

  4. 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.
  5. 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.
  6. 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.


  7. (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.
  8. (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.).
  9. (57) The subtype defined by a component_definition, See section 3.6 Array Types, has to be a definite subtype.
  10. (58) If a record type does not have a variant_part, then the same components are present in all values of the type.
  11. (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.
  12. (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.
  13. (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.


  14. Examples of record type declarations:
  15. type Date is
          Day   : Integer range 1 .. 31;
          Month : Month_Name;
          Year  : Integer range 0 .. 4000;
       end record;
  16. type Complex is
          Re : Real := 0.0;
          Im : Real := 0.0;
       end record;
  17. Examples of record variables:
  18. Tomorrow, Yesterday : Date;
    A, B, C : Complex;
  19. -- both components of A, B, and C are implicitly initialized to zero

Go to the first, previous, next, last section, table of contents.