9.7 ABE Diagnostics

GNAT performs extensive diagnostics on a unit-by-unit basis for all scenarios that invoke internal targets, regardless of whether the dynamic, SPARK, or static model is in effect.

Note that GNAT emits warnings rather than hard errors whenever it encounters an elaboration problem. This is because the elaboration model in effect may be too conservative, or a particular scenario may not be invoked due conditional execution. The warnings can be suppressed selectively with pragma Warnings (Off) or globally with compiler switch -gnatwL.

A `guaranteed ABE' arises when the body of a target is not elaborated early enough, and causes `all' scenarios that directly invoke the target to fail.

package body Guaranteed_ABE is
   function ABE return Integer;

   Val : constant Integer := ABE;

   function ABE return Integer is
   begin
     ...
   end ABE;
end Guaranteed_ABE;

In the example above, the elaboration of Guaranteed_ABE’s body elaborates the declaration of Val. This invokes function ABE, however the body of ABE has not been elaborated yet. GNAT emits the following diagnostic:

4.    Val : constant Integer := ABE;
                                |
   >>> warning: cannot call "ABE" before body seen
   >>> warning: Program_Error will be raised at run time

A `conditional ABE' arises when the body of a target is not elaborated early enough, and causes `some' scenarios that directly invoke the target to fail.

 1. package body Conditional_ABE is
 2.    procedure Force_Body is null;
 3.
 4.    generic
 5.       with function Func return Integer;
 6.    package Gen is
 7.       Val : constant Integer := Func;
 8.    end Gen;
 9.
10.    function ABE return Integer;
11.
12.    function Cause_ABE return Boolean is
13.       package Inst is new Gen (ABE);
14.    begin
15.       ...
16.    end Cause_ABE;
17.
18.    Val : constant Boolean := Cause_ABE;
19.
20.    function ABE return Integer is
21.    begin
22.       ...
23.    end ABE;
24.
25.    Safe : constant Boolean := Cause_ABE;
26. end Conditional_ABE;

In the example above, the elaboration of package body Conditional_ABE elaborates the declaration of Val. This invokes function Cause_ABE, which instantiates generic unit Gen as Inst. The elaboration of Inst invokes function ABE, however the body of ABE has not been elaborated yet. GNAT emits the following diagnostic:

13.       package Inst is new Gen (ABE);
          |
    >>> warning: in instantiation at line 7
    >>> warning: cannot call "ABE" before body seen
    >>> warning: Program_Error may be raised at run time
    >>> warning:   body of unit "Conditional_ABE" elaborated
    >>> warning:   function "Cause_ABE" called at line 18
    >>> warning:   function "ABE" called at line 7, instance at line 13

Note that the same ABE problem does not occur with the elaboration of declaration Safe because the body of function ABE has already been elaborated at that point.