From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1914) id 99C37385801B; Thu, 6 Jan 2022 17:14:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 99C37385801B MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Pierre-Marie de Rodat To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-6309] [Ada] Fix regression in freezing code for instantiations X-Act-Checkin: gcc X-Git-Author: Eric Botcazou X-Git-Refname: refs/heads/master X-Git-Oldrev: 00a66280cdafe17ad76944baac6fb7d0ae83e802 X-Git-Newrev: b542b2d97f2c574d58f6f071cdf1314ceb51587e Message-Id: <20220106171428.99C37385801B@sourceware.org> Date: Thu, 6 Jan 2022 17:14:28 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 06 Jan 2022 17:14:28 -0000 https://gcc.gnu.org/g:b542b2d97f2c574d58f6f071cdf1314ceb51587e commit r12-6309-gb542b2d97f2c574d58f6f071cdf1314ceb51587e Author: Eric Botcazou 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.