- (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.
(2)
body_stub ::= subprogram_body_stub | package_body_stub | task_body_stub | protected_body_stub
(3)
subprogram_body_stub ::= 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)
- 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.
- (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)
- 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)
- 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.
-
- (16)
(4) 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)
- 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;
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12