Go to the first, previous, next, last section, table of contents.
-
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
-
body_stub ::=
subprogram_body_stub
| package_body_stub
| task_body_stub
| protected_body_stub
-
subprogram_body_stub ::= subprogram_specification is separate;
-
package_body_stub ::= package body defining_identifier is separate;
-
task_body_stub ::= task body defining_identifier is separate;
-
protected_body_stub ::=
protected body defining_identifier is separate;
-
subunit ::= separate (parent_unit_name) proper_body
Legality Rules
-
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 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.
-
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.
-
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.
-
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.
-
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.
-
The defining_identifiers of all body_stubs that appear immediately
within a particular declarative_part shall be distinct.
Post-Compilation Rules
-
For each body_stub, there shall be a subunit containing the
corresponding proper_body.
NOTES
-
(4) The rules in See section 10.1.4 The Compilation Process, say that a
body_stub is equivalent to the corresponding proper_body. This implies:
-
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.
-
The effect of the elaboration of a body_stub is to elaborate the
subunit.
Examples
-
The package Parent is first written without subunits:
-
package Parent is
procedure Inner;
end Parent;
-
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;
-
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):
-
package body Parent is
Variable : String := "Hello, there.";
procedure Inner is separate;
end Parent;
-
with Ada.Text_IO;
separate(Parent)
procedure Inner is
begin
Ada.Text_IO.Put_Line(Variable);
end Inner;
Go to the first, previous, next, last section, table of contents.