Next: , Previous: 10.1.2, Up: 10.1


10.1.3 Subunits of Compilation Units

1
Subunits are like child units, with these (important) differences: subunits support the separate compilation of bodies only (not declarations); the parent contains a body_stub to indicate the existence and place of each of its subunits; declarations appearing in the parent's body can be visible within the subunits.

Syntax

2

body_stub::= subprogram_body_stub package_body_stub task_body_stub protected_body_stub

3/2

subprogram_body_stub::=
   [overriding_indicator]
   subprogram_specification is separate;

4

package_body_stub::= package body defining_identifier is separate;

5

task_body_stub::= task body defining_identifier is separate;

6

protected_body_stub::= protected body defining_identifier is separate;

7

subunit::= separate (parent_unit_name) proper_body
Legality Rules

8/2
The parent body of a subunit is the body of the program unit denoted by its parent_unit_name. The term subunit is used to refer to a subunit and also to the proper_body of a subunit. The subunits of a program unit include any subunit that names that program unit as its parent, as well as any subunit that names such a subunit as its parent (recursively).9
The parent body of a subunit shall be present in the current environment, and shall contain a corresponding body_stub with the same defining_identifier as the subunit.

10/2
A package_body_stub shall be the completion of a package_declaration (see 7.1) or generic_package_declaration (see 12.1); a task_body_stub (see 10.1.3) shall be the completion of a task declaration; a protected_body_stub (see 10.1.3) shall be the completion of a protected declaration.

11
In contrast, a subprogram_body_stub need not be the completion of a previous declaration, in which case the _stub declares the subprogram. If the _stub is a completion, it shall be the completion of a subprogram_declaration or generic_subprogram_declaration. The profile of a subprogram_body_stub that completes a declaration shall conform fully to that of the declaration. 12
A subunit that corresponds to a body_stub shall be of the same kind (package_, subprogram_, task_, or protected_) as the body_stub. The profile of a subprogram_body subunit shall be fully conformant to that of the corresponding body_stub. 13
A body_stub shall appear immediately within the declarative_part of a compilation unit body. This rule does not apply within an instance of a generic unit.

14
The defining_identifiers of all body_stubs that appear immediately within a particular declarative_part shall be distinct.

Post-Compilation Rules

15
For each body_stub, there shall be a subunit containing the corresponding proper_body.

     NOTES

16

 The rules in 10.1.4, "10.1.4 The Compilation Process" say that a body_stub is equivalent to the corresponding proper_body. This implies:

17

18

Examples

19
The package Parent is first written without subunits:

20

     package Parent is
         procedure Inner;
     end Parent;

21

     with Ada.Text_IO;
     package body Parent is
         Variable String := "Hello, there.";
         procedure Inner is
         begin
             Ada.Text_IO.Put_Line(Variable);
         end Inner;
     end Parent;

22
The body of procedure Inner may be turned into a subunit by rewriting the package body as follows (with the declaration of Parent remaining the same):

23

     package body Parent is
         Variable String := "Hello, there.";
         procedure Inner is separate;
     end Parent;

24

     with Ada.Text_IO;
     separate(Parent)
     procedure Inner is
     begin
         Ada.Text_IO.Put_Line(Variable);
     end Inner;