diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2020-10-02 19:15:05 +0200 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2020-11-24 05:16:02 -0500 |
commit | dcb1cad0e0747501e9d54eeec6b0481eb87d23c5 (patch) | |
tree | c9da9866f4c2358954f3ff51c416804f103a31ce | |
parent | e269fedf8c150f26e7651c0093ce02bef11ed5d6 (diff) | |
download | gcc-dcb1cad0e0747501e9d54eeec6b0481eb87d23c5.zip gcc-dcb1cad0e0747501e9d54eeec6b0481eb87d23c5.tar.gz gcc-dcb1cad0e0747501e9d54eeec6b0481eb87d23c5.tar.bz2 |
[Ada] Fix internal error on multiple nested instantiations
gcc/ada/
* sem_ch12.adb (Analyze_Associations) <Explicit_Freeze_Check>: Test
that the instance is in a statement sequence instead of local scope.
(Freeze_Subprogram_Body): Use the special delayed placement with
regard to the parent instance only if its Sloc is strictly greater.
(Install_Body): Likewise.
-rw-r--r-- | gcc/ada/sem_ch12.adb | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index af77263..f9df624 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -1998,7 +1998,7 @@ package body Sem_Ch12 is Gen_Par : Entity_Id; Needs_Freezing : Boolean; - S : Entity_Id; + P : Node_Id; procedure Check_Generic_Parent; -- The actual may be an instantiation of a unit @@ -2102,18 +2102,15 @@ package body Sem_Ch12 is Needs_Freezing := True; - S := Current_Scope; - while Present (S) loop - if Ekind (S) in E_Block - | E_Function - | E_Loop - | E_Procedure + P := Parent (I_Node); + while Nkind (P) /= N_Compilation_Unit loop + if Nkind (P) = N_Handled_Sequence_Of_Statements then Needs_Freezing := False; exit; end if; - S := Scope (S); + P := Parent (P); end loop; if Needs_Freezing then @@ -9084,7 +9081,7 @@ package body Sem_Ch12 is -- -- procedure P ... -- this body freezes Parent_Inst -- - -- package Inst is new ... + -- procedure Inst is new ... -- -- In this particular scenario, the freeze node for Inst must be -- inserted in the same manner as that of Parent_Inst - before the @@ -9097,7 +9094,7 @@ package body Sem_Ch12 is elsif List_Containing (Get_Unit_Instantiation_Node (Par)) = List_Containing (Inst_Node) - and then Sloc (Freeze_Node (Par)) < Sloc (Inst_Node) + and then Sloc (Freeze_Node (Par)) <= Sloc (Inst_Node) then Insert_Freeze_Node_For_Instance (Inst_Node, F_Node); @@ -9938,7 +9935,7 @@ package body Sem_Ch12 is if Parent (List_Containing (Get_Unit_Instantiation_Node (Par))) = Parent (List_Containing (N)) - and then Sloc (Freeze_Node (Par)) < Sloc (N) + and then Sloc (Freeze_Node (Par)) <= Sloc (N) then Insert_Freeze_Node_For_Instance (N, F_Node); else |