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