This patch adds another suggestion to the elaboration order diagnostics.
An elaboration circularity involving a task activation may be resolved
through pragma Restrictions (No_Entry_Calls_In_Elaboration_Code).

------------
-- Source --
------------

--  no_entry_calls.txt

pragma Restrictions (No_Entry_Calls_In_Elaboration_Code);

--  a.ads

package A is
   task type Task_Typ is
      entry Start;
   end Task_Typ;

   procedure Proc;
end A;

--  a.adb

with B;

package body A is
   task body Task_Typ is
   begin
      accept Start;
      B.Proc;
   end Task_Typ;

   Elab : Task_Typ;

   procedure Proc is null;
end A;

--  b.ads

package B is
   procedure Proc;
end B;

--  b.adb

with A;

package body B is
   procedure Proc is
   begin
      A.Proc;
   end Proc;
end B;

--  main.adb

with A;

--  +--> A spec               B spec
--  |      ^                  ^ ^
--  |      |        with      | |
--  |  sbb | +----------------+ | sbb
--  |      | |                  |
--  |      | |   Invocation     |
--  |    A body ------------> B body
--  |      ^                  | |
--  |      |     Invocation   | |
--  |      +------------------+ |
--  |                           |
--  |            Invocation     |
--  +---------------------------+
--
--  The cycle is:
--
--    A body --> A body

procedure Main is begin null; end Main;

----------------------------
-- Compilation and output --
----------------------------

$ gnatmake -f -q main.adb -gnatd_F
$ gnatmake -f -q main.adb -gnatec=no_entry_calls.txt
error: Elaboration circularity detected
info:
info:    Reason:
info:
info:      unit "a (body)" depends on its own elaboration
info:
info:    Circularity:
info:
info:      unit "a (body)" invokes a construct of unit "a (body)" at
             elaboration time
info:        path 1:
info:          elaboration of unit "a (body)"
info:          activation of local task declared at "a.ads":2:14
info:          call to subprogram "proc" declared at "b.ads":2:14
info:          call to subprogram "proc" declared at "a.ads":6:14
info:
info:    Suggestions:
info:
info:      use pragma Restrictions (No_Entry_Calls_In_Elaboration_Code)
info:      use the dynamic elaboration model (compiler switch -gnatE)
info:
gnatmake: *** bind failed.

Tested on x86_64-pc-linux-gnu, committed on trunk

2019-07-09  Hristian Kirtchev  <kirtc...@adacore.com>

gcc/ada/

        * bindo.ads: Move type Precedence_Kind from the private to the
        visible part of the unit.
        * bindo-augmentors.adb: Remove the use of global data as it is
        bad practice.
        (Augment_Library_Graph): Update the parameter profile.
        (Is_Visited, Set_Is_Visited): Remove.
        (Visit_Elaboration_Root, Visit_Elaboration_Roots): Update the
        parameter profile and comment on usage.
        (Visit_Vertex): Likewise.  Also keep track of which invocation
        edge activates a task.
        * bindo-augmentors.ads (Augment_Library_Graph): Update the
        parameter profile and comment on usage.
        * bindo-builders.adb (Create_Forced_Edge,
        Create_Spec_And_Body_Edge, Create_With_Edge): Update the call to
        Add_Edge.
        * bindo-diagnostics.adb: Add with end use clauses for Restrict
        and Rident.
        (Output_Dynamic_Model_Suggestions): Remove.
        (Output_Invocation_Related_Suggestions): New routine.
        (Output_Suggestions): Output all invocation-related suggestions
        together.
        * bindo-elaborators.adb: Remove types Comparator_Ptr and
        Predicate_Ptr.
        (Find_Best_Vertex): Update the parameter profile.
        * bindo-graphs.adb (Activates_Task): New routine.
        (Add_Body_Before_Spec_Edge): Update the call to
        Add_Edge_With_Return.
        (Add_Edge): Update the parameter profile and the call to
        Add_Edge_With_Return.
        (Add_Edge_With_Return): Update the parameter profile and comment
        on usage.
        (At_Least_One_Edge_Satisfies): New routine.
        (Contains_Elaborate_All_Edge): Reimplement.
        (Contains_Static_Successor_Edge, Contains_Task_Activation): New
        routine.
        (Contains_Weak_Static_Successor): Remove.
        (Is_Static_Successor_Edge): New routine.
        * bindo-graphs.ads: Add types LGE_Predicate_Ptr,
        LGV_Comparator_Ptr, and LGV_Predicate_Ptr.  Update type
        Library_Graph_Edge_Attributes to capture whether an invocation
        edge activates a task.  Update the value of
        No_Library_Graph_Edge_Attributes.
        (Activates_Task): Update the parameter profile and comment on
        usage.
        (Contains_Static_Successor_Edge, Contains_Task_Activation): New
        routines.
        (Contains_Weak_Static_Successor): Remove.
        * doc/gnat_ugn/elaboration_order_handling_in_gnat.rst:
        Update the documentation to reflect the new task-related advice.
        * gnat_ugn.texi: Regenerate.

Attachment: patch.diff.gz
Description: application/gzip

Reply via email to