Aspect Part_Of is first translated into a corresponding pragma; then, we
use Find_Related_Context to recover the node where the aspect was
originally attached.

However, this routine was only working for pragmas Part_Of coming from
aspects applied to generic packages instantiated within other program
units; it was returning Empty for generic package instantiated as
standalone compilation units, e.g.:

   with Generic_Pkg;
   private package Parent.Child_Instance is new Generic_Pkg
     with Part_Of => State;

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

gcc/ada/

        * sem_elab.adb (Process_SPARK_Instantiation): Fix typo in
        comment.
        * sem_prag.adb (Find_Related_Context): Add missing reference to
        No_Caching in the comment; handle pragmas on compilation units.
diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb
--- a/gcc/ada/sem_elab.adb
+++ b/gcc/ada/sem_elab.adb
@@ -15121,7 +15121,7 @@ package body Sem_Elab is
          Inst_Rep : Scenario_Rep_Id;
          In_State : Processing_In_State);
       pragma Inline (Process_SPARK_Instantiation);
-      --  Verify that instanciation Inst does not precede the generic body it
+      --  Verify that instantiation Inst does not precede the generic body it
       --  instantiates (SPARK RM 7.7(6)). Inst_Rep is the representation of the
       --  instantiation. In_State is the current state of the Processing phase.
 


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
@@ -243,6 +243,7 @@ package body Sem_Prag is
    --    Constant_After_Elaboration
    --    Effective_Reads
    --    Effective_Writers
+   --    No_Caching
    --    Part_Of
    --  Find the first source declaration or statement found while traversing
    --  the previous node chain starting from pragma Prag. If flag Do_Checks is
@@ -30474,6 +30475,16 @@ package body Sem_Prag is
       Stmt : Node_Id;
 
    begin
+      --  If the pragma comes from an aspect on a compilation unit that is a
+      --  package instance, then return the original package instantiation
+      --  node.
+
+      if Nkind (Parent (Prag)) = N_Compilation_Unit_Aux then
+         return
+           Get_Unit_Instantiation_Node
+             (Defining_Entity (Unit (Enclosing_Comp_Unit_Node (Prag))));
+      end if;
+
       Stmt := Prev (Prag);
       while Present (Stmt) loop
 


Reply via email to