Next: Summary of Procedures for Elaboration Control, Previous: What to Do If the Default Elaboration Behavior Fails, Up: Elaboration Order Handling in GNAT
Access-to-subprogram types (introduced in Ada 95) complicate the handling of elaboration. The trouble is that it becomes impossible to tell at compile time which procedure is being called. This means that it is not possible for the binder to analyze the elaboration requirements in this case.
If at the point at which the access value is created
(i.e., the evaluation of P'Access
for a subprogram P
),
the body of the subprogram is
known to have been elaborated, then the access value is safe, and its use
does not require a check. This may be achieved by appropriate arrangement
of the order of declarations if the subprogram is in the current unit,
or, if the subprogram is in another unit, by using pragma
Pure
, Preelaborate
, or Elaborate_Body
on the referenced unit.
If the referenced body is not known to have been elaborated at the point
the access value is created, then any use of the access value must do a
dynamic check, and this dynamic check will fail and raise a
Program_Error
exception if the body has not been elaborated yet.
GNAT will generate the necessary checks, and in addition, if the
-gnatwl
switch is set, will generate warnings that such checks are required.
The use of dynamic dispatching for tagged types similarly generates
a requirement for dynamic checks, and premature calls to any primitive
operation of a tagged type before the body of the operation has been
elaborated, will result in the raising of Program_Error
.