[Ada] Ensure No_Specification_Of_Aspect forbids pragmas and repr. clauses

Message ID 20200707092736.GA41506@adacore.com
State New
Headers show
Series
  • [Ada] Ensure No_Specification_Of_Aspect forbids pragmas and repr. clauses
Related show

Commit Message

Pierre-Marie de Rodat July 7, 2020, 9:27 a.m.
Section 13.12.1 of the Ada reference manual states the following: [The
No_Specification_of_Aspect pragma] Identifies an aspect for which no
aspect_specification, attribute_definition_clause, or pragma is given.
GNAT already checks for aspects, this commit adds checks for attribute
definitions and pragmas.

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

gcc/ada/

	* sem_ch13.adb (Analyze_Attribute_Definition_Clause): Add call
	to Check_Restriction_No_Specification_Of_Aspect.
	* sem_prag.adb (Analyze_Pragma): Likewise.
	* restrict.ads (Check_Restriction_No_Specification_Of_Aspect):
	Mention possible new node kinds in documentation.
	* restrict.adb (Check_Restriction_No_Specification_Of_Aspect):
	Retrieve aspect id from different fields if given node is an
	N_Pragma or an N_Attribute_Definition_Clause.

Patch

diff --git a/gcc/ada/restrict.adb b/gcc/ada/restrict.adb
--- a/gcc/ada/restrict.adb
+++ b/gcc/ada/restrict.adb
@@ -626,7 +626,14 @@  package body Restrict is
          return;
       end if;
 
-      Id := Identifier (N);
+      if Nkind (N) = N_Pragma then
+         Id := Pragma_Identifier (N);
+      elsif Nkind (N) = N_Attribute_Definition_Clause then
+         Id := N;
+      else
+         Id := Identifier (N);
+      end if;
+
       A_Id := Get_Aspect_Id (Chars (Id));
       pragma Assert (A_Id /= No_Aspect);
 


diff --git a/gcc/ada/restrict.ads b/gcc/ada/restrict.ads
--- a/gcc/ada/restrict.ads
+++ b/gcc/ada/restrict.ads
@@ -283,9 +283,10 @@  package Restrict is
    --  the node to which an error will be attached if necessary.
 
    procedure Check_Restriction_No_Specification_Of_Aspect (N : Node_Id);
-   --  N is the node id for an N_Aspect_Specification. An error message
-   --  (warning) will be issued if a restriction (warning) was previously set
-   --  for this aspect using Set_No_Specification_Of_Aspect.
+   --  N is the node id for an N_Aspect_Specification, an N_Pragma, or an
+   --  N_Attribute_Definition_Clause. An error message (warning) will be issued
+   --  if a restriction (warning) was previously set for this aspect using
+   --  Set_No_Specification_Of_Aspect.
 
    procedure Check_Restriction_No_Use_Of_Attribute (N : Node_Id);
    --  N denotes an attribute definition clause or an attribute reference. An


diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -5643,6 +5643,13 @@  package body Sem_Ch13 is
 
       Check_Restriction_No_Use_Of_Attribute (N);
 
+      if Get_Aspect_Id (Chars (N)) /= No_Aspect then
+         --  6.1/3 No_Specification_of_Aspect: Identifies an aspect for which
+         --    no aspect_specification, attribute_definition_clause, or pragma
+         --    is given.
+         Check_Restriction_No_Specification_Of_Aspect (N);
+      end if;
+
       --  Ignore some selected attributes in CodePeer mode since they are not
       --  relevant in this context.
 


diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -11477,6 +11477,13 @@  package body Sem_Prag is
 
       Check_Restriction_No_Use_Of_Pragma (N);
 
+      if Get_Aspect_Id (Chars (Pragma_Identifier (N))) /= No_Aspect then
+         --  6.1/3 No_Specification_of_Aspect: Identifies an aspect for which
+         --    no aspect_specification, attribute_definition_clause, or pragma
+         --    is given.
+         Check_Restriction_No_Specification_Of_Aspect (N);
+      end if;
+
       --  Ignore pragma if Ignore_Pragma applies. Also ignore pragma
       --  Default_Scalar_Storage_Order if the -gnatI switch was given.