aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHristian Kirtchev <kirtchev@adacore.com>2018-05-22 13:17:22 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-05-22 13:17:22 +0000
commit80f0c69c2c698023f76d0e5db7e2b42e1fd7b637 (patch)
treebd5e35605e38e6b79c8cb9bf7ab8721a6bbc1cdf /gcc
parent440ed9f839a068948c72441eda2ef3da515f4656 (diff)
downloadgcc-80f0c69c2c698023f76d0e5db7e2b42e1fd7b637.zip
gcc-80f0c69c2c698023f76d0e5db7e2b42e1fd7b637.tar.gz
gcc-80f0c69c2c698023f76d0e5db7e2b42e1fd7b637.tar.bz2
[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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/sem_ch6.adb36
2 files changed, 26 insertions, 16 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 7835199..71e0aaf 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index 3dece02..55298e9 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -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;
--------------------------------------