[COMMITED] ada: Fix location of pragmas coming from aspects in top-level instances

Message ID 20220926091542.273909-1-poulhies@adacore.com
State Committed
Commit a490e7da3ad435d72916564e166f966eabe7328f
Headers
Series [COMMITED] ada: Fix location of pragmas coming from aspects in top-level instances |

Commit Message

Marc Poulhiès Sept. 26, 2022, 9:15 a.m. UTC
  From: Piotr Trojanek <trojanek@adacore.com>

This patch fixes an AST anomaly where pragmas that correspond to aspects
of a generic package declaration appeared as the auxiliary declarations
of the compilation unit for the instantiated package body.

In particular, this anomaly happened for aspect Annotate and affected
GNATprove, which didn't pick pragma corresponding to this aspect.

gcc/ada/

	* sem_ch12.adb (Build_Instance_Compilation_Unit_Nodes): Relocate
	auxiliary declarations from the original compilation unit to the
	newly created compilation unit for the spec.
---
 gcc/ada/sem_ch12.adb | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
  

Patch

diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 9525140b45b..ab2e1825679 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -6296,13 +6296,16 @@  package body Sem_Ch12 is
       Old_Main   : constant Entity_Id := Cunit_Entity (Main_Unit);
 
    begin
-      --  A new compilation unit node is built for the instance declaration
+      --  A new compilation unit node is built for the instance declaration.
+      --  It relocates the auxiliary declaration node from the compilation unit
+      --  where the instance appeared, so that declarations that originally
+      --  followed the instance will be attached to the spec compilation unit.
 
       Decl_Cunit :=
         Make_Compilation_Unit (Sloc (N),
           Context_Items  => Empty_List,
           Unit           => Act_Decl,
-          Aux_Decls_Node => Make_Compilation_Unit_Aux (Sloc (N)));
+          Aux_Decls_Node => Relocate_Node (Aux_Decls_Node (Parent (N))));
 
       Set_Parent_Spec (Act_Decl, Parent_Spec (N));