Commit 80f0c69c by Hristian Kirtchev Committed by Pierre-Marie de Rodat

[Ada] Missing error on illegal categorization dependency

This patch modifies the analysis of subprogram declarations to ensure that an
aspect which is converted into a categorization pragma is properly taken into
account when verifying the dependencies of a subprogram unit.

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

--  pack.ads

package Pack is end Pack;

--  proc1.ads

with Pack;

procedure Proc1 with Pure;

--  proc2.ads

with Pack;

procedure Proc2;
pragma Pure (Proc2);

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

$ gcc -c proc1.ads
$ gcc -c proc2.ads
proc1.ads:1:06: cannot depend on "Pack" (wrong categorization)
proc1.ads:1:06: pure unit cannot depend on non-pure unit
proc2.ads:1:06: cannot depend on "Pack" (wrong categorization)
proc2.ads:1:06: pure unit cannot depend on non-pure unit

2018-05-22  Hristian Kirtchev  <kirtchev@adacore.com>

gcc/ada/

	* sem_ch6.adb (Analyze_Subprogram_Declaration): Set the proper
	categorization of the unit after processing the aspects in case one of
	its aspects is converted into a categorization pragma.

From-SVN: r260506
parent 440ed9f8
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
* sem_ch6.adb (Analyze_Subprogram_Declaration): Set the proper
categorization of the unit after processing the aspects in case one of
its aspects is converted into a categorization pragma.
2018-05-21 Ed Schonberg <schonberg@adacore.com>
* freeze.adb (Warn_Overlay): Do not emit a wawrning on an object
......
......@@ -4844,18 +4844,6 @@ package body Sem_Ch6 is
Set_Kill_Elaboration_Checks (Designator);
end if;
if Scop /= Standard_Standard and then not Is_Child_Unit (Designator) then
Set_Categorization_From_Scope (Designator, Scop);
else
-- For a compilation unit, check for library-unit pragmas
Push_Scope (Designator);
Set_Categorization_From_Pragmas (N);
Validate_Categorization_Dependency (N, Designator);
Pop_Scope;
end if;
-- For a compilation unit, set body required. This flag will only be
-- reset if a valid Import or Interface pragma is processed later on.
......@@ -4883,19 +4871,35 @@ package body Sem_Ch6 is
Write_Eol;
end if;
if Is_Protected_Type (Current_Scope) then
-- Indicate that this is a protected operation, because it may be
-- used in subsequent declarations within the protected type.
-- Indicate that this is a protected operation, because it may be used
-- in subsequent declarations within the protected type.
if Is_Protected_Type (Current_Scope) then
Set_Convention (Designator, Convention_Protected);
end if;
List_Inherited_Pre_Post_Aspects (Designator);
-- Process the aspects before establishing the proper categorization in
-- case the subprogram is a compilation unit and one of its aspects is
-- converted into a categorization pragma.
if Has_Aspects (N) then
Analyze_Aspect_Specifications (N, Designator);
end if;
if Scop /= Standard_Standard and then not Is_Child_Unit (Designator) then
Set_Categorization_From_Scope (Designator, Scop);
-- Otherwise the unit is a compilation unit and/or a child unit. Set the
-- proper categorization of the unit based on its pragmas.
else
Push_Scope (Designator);
Set_Categorization_From_Pragmas (N);
Validate_Categorization_Dependency (N, Designator);
Pop_Scope;
end if;
end Analyze_Subprogram_Declaration;
--------------------------------------
......
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