Commit 3f99a611 by Hristian Kirtchev Committed by Pierre-Marie de Rodat

[Ada] Crash on entry in generic with dynamic elaboration checks

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.

2018-08-21  Hristian Kirtchev  <kirtchev@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.

From-SVN: r263712
parent 83fadfd9
2018-08-21 Hristian Kirtchev <kirtchev@adacore.com>
* 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.
2018-08-21 Arnaud Charlet <charlet@adacore.com>
* set_targ.adb: Mark some CodePeer message as Intentional.
......
......@@ -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
......
......@@ -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)
......
2018-08-21 Hristian Kirtchev <kirtchev@adacore.com>
* gnat.dg/elab6.adb, gnat.dg/elab6.ads, gnat.dg/elab6_pkg.adb,
gnat.dg/elab6_pkg.ads: New testcase.
2018-08-21 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/expr_func5.adb: New testcase.
......
-- { dg-do compile }
-- { dg-options "-gnatE" }
package body Elab6 is
procedure Force_Body is null;
package Inst is new Elab6_Pkg;
end Elab6;
with Elab6_Pkg;
generic
package Elab6 is
procedure Force_Body;
end Elab6;
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;
generic
package Elab6_Pkg is
procedure Call_Ent;
end Elab6_Pkg;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment