7.1 Package Specifications and Declarations
1
[A package is generally provided in two parts: a 
package_specification and a package_body. 
Every package has a package_specification, 
but not all packages have a package_body.] 
Syntax
2
package_declaration ::= package_specification;
 
3
package_specification ::= 
    package defining_program_unit_name is
      {
basic_declarative_item}
   [
private
      {
basic_declarative_item}]
    
end [[
parent_unit_name.]
identifier]
 
4
If an identifier 
or parent_unit_name.identifier 
appears at the end of a package_specification, 
then this sequence of lexical elements shall repeat the defining_program_unit_name. 
Legality Rules
5/2
{
AI-00434-01} 
{requires a completion (package_declaration) 
[partial]} {requires 
a completion (generic_package_declaration) [partial]} A 
package_declaration or 
generic_package_declaration 
requires a completion [(a body)] if it contains any 
basic_declarative_item declarative_item 
that requires a completion, but whose completion is not in its 
package_specification. 
 
5.a
To be honest: If an implementation supports 
it, a pragma Import may substitute for the 
body of a package or generic package. 
Static Semantics
6/2
{
AI-00420-01} 
{
AI-00434-01} 
{visible part (of a package (other than 
a generic formal package)) [partial]} The 
first list of 
basic_declarative_items declarative_items 
of a 
package_specification of a package other 
than a generic formal package is called the 
visible part of the 
package. [
{private part (of a package) 
[partial]} The optional list of 
basic_declarative_items declarative_items 
after the reserved word 
private (of any 
package_specification) 
is called the 
private part of the package. If the reserved word 
private does not appear, the package has an implicit empty private 
part.]
 Each list of basic_declarative_items 
of a package_specification forms a declaration 
list of the package.{declaration 
list (package_specification) [partial]}  
6.a
Ramification: This definition of visible 
part does not apply to generic formal packages — 
12.7 
defines the visible part of a generic formal package.
 
6.b
The implicit empty private part is important 
because certain implicit declarations occur there if the package is a 
child package, and it defines types in its visible part that are derived 
from, or contain as components, private types declared within the parent 
package. These implicit declarations are visible in children of the child 
package. See 
10.1.1. 
 
7
[An entity declared in the private part of a package 
is visible only within the declarative region of the package itself (including 
any child units — see 
10.1.1). In 
contrast, expanded names denoting entities declared in the visible part 
can be used even outside the package; furthermore, direct visibility 
of such entities can be achieved by means of 
use_clauses 
(see 
4.1.3 and 
8.4).] 
 
Dynamic Semantics
8
{elaboration (package_declaration) 
[partial]} The elaboration of a 
package_declaration 
consists of the elaboration of its 
basic_declarative_items 
in the given order. 
 
9
1  The visible part of a package contains 
all the information that another program unit is able to know about the 
package.
10
2  If a declaration occurs immediately within 
the specification of a package, and the declaration has a corresponding 
completion that is a body, then that body has to occur immediately within 
the body of the package. 
10.a
Proof: This follows from the fact that 
the declaration and completion are required to occur immediately within 
the same declarative region, and the fact that bodies 
are disallowed (by the Syntax Rules) in package_specifications. 
This does not apply to instances of generic units, whose bodies can occur 
in package_specifications. 
Examples
11
Example of a package 
declaration: 
12
package Rational_Numbers is
13
   type Rational is
      record
         Numerator   : Integer;
         Denominator : Positive;
      end record;
14
   function "="(X,Y : Rational) return Boolean;
15
   function "/"  (X,Y : Integer)  return Rational;  --  to construct a rational number
16
   function "+"  (X,Y : Rational) return Rational;
   function "-"  (X,Y : Rational) return Rational;
   function "*"  (X,Y : Rational) return Rational;
   function "/"  (X,Y : Rational) return Rational;
end Rational_Numbers;
17
There are also many examples of package declarations 
in the predefined language environment (see 
Annex 
A). 
 
Incompatibilities With Ada 83
17.a
{
incompatibilities with Ada 83} 
In 
Ada 83, a library package is allowed to have a body even if it doesn't 
need one. In Ada 95, a library package body is either required or forbidden 
— never optional. The workaround is to add 
pragma Elaborate_Body, 
or something else requiring a body, to each library package that has 
a body that isn't otherwise required. 
 
Wording Changes from Ada 83
17.b
We have moved the syntax into this clause and 
the next clause from RM83-7.1, “Package Structure”, which 
we have removed.
17.c
RM83 was unclear on the rules about when a package 
requires a body. For example, RM83-7.1(4) and RM83-7.1(8) clearly forgot 
about the case of an incomplete type declared in a package_declaration 
but completed in the body. In addition, RM83 forgot to make this rule 
apply to a generic package. We have corrected these rules. Finally, since 
we now allow a pragma Import for any explicit 
declaration, the completion rules need to take this into account as well. 
Wording Changes from Ada 95
17.d/2
{
AI95-00420-01} 
Defined “declaration list” to avoid 
ambiguity in other rules as to whether packages are included.