This patch modifies the set of attributes that applies to entries and
entry families to include elaboration entities used by the
access-before-elaboration mechanism.

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

2018-08-21  Hristian Kirtchev  <kirtc...@adacore.com>

gcc/ada/

        * einfo.adb (Elaboration_Entity): Include entries and entry
        families in the set of legal entities.
        (Elaboration_Entity_Required): Include entries and entry
        families in the set of legal entities.
        (Set_Elaboration_Entity): Include entries and entry families in
        the set of legal entities.
        (Set_Elaboration_Entity_Required): Include entries and entry
        families in the set of legal entities.
        (Write_Field13_Name): Update the output of attribute
        Elaboration_Entity.
        * einfo.ads: Attributes Elaboration_Entity and
        Elaboration_Entity_Required now apply to entries and entry
        families.

gcc/testsuite/

        * gnat.dg/elab6.adb, gnat.dg/elab6.ads, gnat.dg/elab6_pkg.adb,
        gnat.dg/elab6_pkg.ads: New testcase.
--- gcc/ada/einfo.adb
+++ gcc/ada/einfo.adb
@@ -1182,7 +1182,7 @@ package body Einfo is
       pragma Assert
         (Is_Subprogram (Id)
            or else
-         Ekind (Id) = E_Package
+         Ekind_In (Id, E_Entry, E_Entry_Family, E_Package)
            or else
          Is_Generic_Unit (Id));
       return Node13 (Id);
@@ -1193,7 +1193,7 @@ package body Einfo is
       pragma Assert
         (Is_Subprogram (Id)
            or else
-         Ekind (Id) = E_Package
+         Ekind_In (Id, E_Entry, E_Entry_Family, E_Package)
            or else
          Is_Generic_Unit (Id));
       return Flag174 (Id);
@@ -4412,7 +4412,7 @@ package body Einfo is
       pragma Assert
         (Is_Subprogram (Id)
            or else
-         Ekind (Id) = E_Package
+         Ekind_In (Id, E_Entry, E_Entry_Family, E_Package)
            or else
          Is_Generic_Unit (Id));
       Set_Node13 (Id, V);
@@ -4423,7 +4423,7 @@ package body Einfo is
       pragma Assert
         (Is_Subprogram (Id)
            or else
-         Ekind (Id) = E_Package
+         Ekind_In (Id, E_Entry, E_Entry_Family, E_Package)
            or else
          Is_Generic_Unit (Id));
       Set_Flag174 (Id, V);
@@ -10355,7 +10355,9 @@ package body Einfo is
          =>
             Write_Str ("Component_Clause");
 
-         when E_Function
+         when E_Entry
+            | E_Entry_Family
+            | E_Function
             | E_Procedure
             | E_Package
             | Generic_Unit_Kind

--- gcc/ada/einfo.ads
+++ gcc/ada/einfo.ads
@@ -1090,10 +1090,10 @@ package Einfo is
 --       to the spec as possible.
 
 --    Elaboration_Entity (Node13)
---       Defined in generic and non-generic package and subprogram entities.
---       This is a counter associated with the unit that is initially set to
---       zero, is incremented when an elaboration request for the unit is
---       made, and is decremented when a finalization request for the unit
+--       Defined in entry, entry family, [generic] package, and subprogram
+--       entities. This is a counter associated with the unit that is initially
+--       set to zero, is incremented when an elaboration request for the unit
+--       is made, and is decremented when a finalization request for the unit
 --       is made. This is used for three purposes. First, it is used to
 --       implement access before elaboration checks (the counter must be
 --       non-zero to call a subprogram at elaboration time). Second, it is
@@ -1110,9 +1110,9 @@ package Einfo is
 --       is elaboration code), but is simply not used for any purpose.
 
 --    Elaboration_Entity_Required (Flag174)
---       Defined in generic and non-generic package and subprogram entities.
---       Set only if Elaboration_Entity is non-Empty to indicate that the
---       counter is required to be non-zero even if there is no other
+--       Defined in entry, entry family, [generic] package, and subprogram
+--       entities. Set only if Elaboration_Entity is non-Empty to indicate that
+--       the counter is required to be non-zero even if there is no other
 --       elaboration code. This occurs when the Elaboration_Entity counter
 --       is used for access before elaboration checks. If the counter is
 --       only used to prevent multiple execution of the elaboration code,
@@ -6058,6 +6058,7 @@ package Einfo is
    --  E_Entry_Family
    --    Protected_Body_Subprogram           (Node11)
    --    Barrier_Function                    (Node12)
+   --    Elaboration_Entity                  (Node13)
    --    Postconditions_Proc                 (Node14)
    --    Entry_Parameters_Type               (Node15)
    --    First_Entity                        (Node17)

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/elab6.adb
@@ -0,0 +1,8 @@
+--  { dg-do compile }
+--  { dg-options "-gnatE" }
+
+package body Elab6 is
+   procedure Force_Body is null;
+
+   package Inst is new Elab6_Pkg;
+end Elab6;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/elab6.ads
@@ -0,0 +1,6 @@
+with Elab6_Pkg;
+
+generic
+package Elab6 is
+   procedure Force_Body;
+end Elab6;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/elab6_pkg.adb
@@ -0,0 +1,17 @@
+package body Elab6_Pkg is
+   protected Prot_Obj is
+      entry Ent;
+   end Prot_Obj;
+
+   procedure Call_Ent is
+   begin
+      Prot_Obj.Ent;
+   end Call_Ent;
+
+   protected body Prot_Obj is
+      entry Ent when True is
+      begin
+         null;
+      end Ent;
+   end Prot_Obj;
+end Elab6_Pkg;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/elab6_pkg.ads
@@ -0,0 +1,4 @@
+generic
+package Elab6_Pkg is
+   procedure Call_Ent;
+end Elab6_Pkg;

Reply via email to