public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-6309] [Ada] Fix regression in freezing code for instantiations
@ 2022-01-06 17:14 Pierre-Marie de Rodat
  0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2022-01-06 17:14 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:b542b2d97f2c574d58f6f071cdf1314ceb51587e

commit r12-6309-gb542b2d97f2c574d58f6f071cdf1314ceb51587e
Author: Eric Botcazou <ebotcazou@adacore.com>
Date:   Thu Dec 9 13:34:09 2021 +0100

    [Ada] Fix regression in freezing code for instantiations
    
    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:
---
 gcc/ada/sem_ch12.adb | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 9010410a87f..fe55c5c20b1 100644
--- 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.


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-01-06 17:14 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-06 17:14 [gcc r12-6309] [Ada] Fix regression in freezing code for instantiations Pierre-Marie de Rodat

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).