Ada Conformity Assessment Authority      Home Conformity Assessment   Test Suite ARGAda Standard
 
Ada Reference Manual (Ada 2022 with Amendment 1)Legal Information
Contents   Index   References   Search   Previous   Next 

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/3
subprogram_body_stub ::= 
    [overriding_indicator]
    subprogram_specification is separate
       [aspect_specification];
4/3
package_body_stub ::= 
   package body defining_identifier is separate
      [aspect_specification];
5/3
task_body_stub ::= 
   task body defining_identifier is separate
      [aspect_specification];
6/3
protected_body_stub ::= 
   protected body defining_identifier is separate
      [aspect_specification];
7
subunit ::= separate (parent_unit_nameproper_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/3
A package_body_stub shall be the completion of a package_declaration or generic_package_declaration; a task_body_stub shall be the completion of a task declaration; a protected_body_stub shall be the completion of a protected declaration.
11/5
In contrast, a subprogram_body_stub can be defined without it being 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.
16
NOTE   The rules in 10.1.4, “The Compilation Process” say that a body_stub is equivalent to the corresponding proper_body. This implies: 
17
Visibility within a subunit is the visibility that would be obtained at the place of the corresponding body_stub (within the parent body) if the context_clause of the subunit were appended to that of the parent body. 
18
The effect of the elaboration of a body_stub is to elaborate the subunit. 

Examples

19/5
Example that defines package Parent 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/5
Example showing how the body of procedure Inner can 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;

Contents   Index   References   Search   Previous   Next 
Ada-Europe Ada 2005 and 2012 Editions sponsored in part by Ada-Europe