diff mbox series

[Ada] Fix regression in freezing code for instantiations

Message ID 20220106171310.GA2921734@adacore.com
State New
Headers show
Series [Ada] Fix regression in freezing code for instantiations | expand

Commit Message

Pierre-Marie de Rodat Jan. 6, 2022, 5:13 p.m. UTC
When going to the outer level for the placement of a freeze node in the
case where the current package has no body, the previous change would
overlook instantiations whose body has not materialized yet.

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

gcc/ada/

	* sem_ch12.adb (Insert_Freeze_Node_For_Instance): When going to
	the outer level, do not jump over following instantiations in
	the list.
diff mbox series

Patch

diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -9703,6 +9703,7 @@  package body Sem_Ch12 is
       Decl     : Node_Id;
       Decls    : List_Id;
       Inst     : Entity_Id;
+      Origin   : Entity_Id;
       Par_Inst : Node_Id;
       Par_N    : Node_Id;
 
@@ -9793,9 +9794,10 @@  package body Sem_Ch12 is
          end;
       end if;
 
-      Decl  := N;
-      Decls := List_Containing (N);
-      Par_N := Parent (Decls);
+      Decl   := N;
+      Decls  := List_Containing (N);
+      Par_N  := Parent (Decls);
+      Origin := Empty;
 
       --  Determine the proper freeze point of an instantiation
 
@@ -9824,10 +9826,13 @@  package body Sem_Ch12 is
                 not In_Same_Source_Unit (Generic_Parent (Par_Inst), Inst)
             then
                while Present (Decl) loop
-                  if (Nkind (Decl) in N_Unit_Body
+                  if ((Nkind (Decl) in N_Unit_Body
                         or else
-                      Nkind (Decl) in N_Body_Stub)
-                    and then Comes_From_Source (Decl)
+                       Nkind (Decl) in N_Body_Stub)
+                      and then Comes_From_Source (Decl))
+                    or else (Present (Origin)
+                              and then Nkind (Decl) in N_Generic_Instantiation
+                              and then Instance_Spec (Decl) /= Origin)
                   then
                      Set_Sloc (F_Node, Sloc (Decl));
                      Insert_Before (Decl, F_Node);
@@ -9851,16 +9856,19 @@  package body Sem_Ch12 is
                return;
 
             --  When the instantiation occurs in a package spec and there is
-            --  no source body which follows, not even of the package itself
-            --  then insert into the declaration list of the outer level.
+            --  no source body which follows, not even of the package itself,
+            --  then insert into the declaration list of the outer level, but
+            --  do not jump over following instantiations in this list because
+            --  they may have a body that has not materialized yet, see above.
 
             elsif Nkind (Par_N) = N_Package_Specification
               and then No (Corresponding_Body (Parent (Par_N)))
               and then Is_List_Member (Parent (Par_N))
             then
-               Decl  := Parent (Par_N);
-               Decls := List_Containing (Decl);
-               Par_N := Parent (Decls);
+               Decl   := Parent (Par_N);
+               Decls  := List_Containing (Decl);
+               Par_N  := Parent (Decls);
+               Origin := Decl;
 
             --  In a package declaration, or if no source body which follows
             --  and at library level, then insert at end of list.