3.11.1 Completions of Declarations
Declarations sometimes come in two parts. 
A 
declaration that requires a second part is said to 
require completion. 
The second part is called the 
completion of 
the declaration (and of the entity declared), and is either another declaration, 
a body, or a 
pragma. 
A 
body is a 
body, 
an 
entry_body, 
a 
null_procedure_declaration 
or an 
expression_function_declaration 
that completes another declaration, or a renaming-as-body (see 
8.5.4). 
 
Name Resolution Rules
A construct that can 
be a completion is interpreted as the completion of a prior declaration 
only if: 
The declaration and the completion occur immediately 
within the same declarative region;
If the declaration is overloadable, then the completion 
either has a type-conformant profile, or is a 
pragma. 
 
Legality Rules
An implicit declaration shall not have a completion. 
For any explicit declaration that is specified to 
require completion, there shall be a corresponding explicit completion, 
unless the declared entity is imported (see 
B.1). 
 
At most one completion is allowed for a given declaration. 
Additional requirements on completions appear where each kind of completion 
is defined. 
A type is 
completely defined 
at a place that is after its full type definition (if it has one) and 
after all of its subcomponent types are completely defined. A type shall 
be completely defined before it is frozen (see 
13.14 
and 
7.3). 
 
98  Completions are in principle allowed 
for any kind of explicit declaration. However, for some kinds of declaration, 
the only allowed completion is an implementation-defined pragma, and 
implementations are not required to have any such pragmas. 
99  There are rules that prevent premature 
uses of declarations that have a corresponding completion. The Elaboration_Checks 
of 
3.11 prevent such uses at run time for 
subprograms, protected operations, tasks, and generic units. The rules 
of 
13.14, “
Freezing 
Rules” prevent, at compile time, premature uses of other entities 
such as private types and deferred constants. 
 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe