Next: , Previous: What to Do If the Default Elaboration Behavior Fails, Up: Elaboration Order Handling in GNAT


C.11 Elaboration for Access-to-Subprogram Values

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.