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).

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).

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).

95 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.

96 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.