From: Arnaud Charlet Date: Fri, 24 Jan 2020 16:58:35 +0000 (-0500) Subject: [Ada] Wrong walk order in Walk_Library_Items X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c21938bee0d0a5cb3da442d3d4500d2eeb416b44;p=gcc.git [Ada] Wrong walk order in Walk_Library_Items 2020-06-04 Arnaud Charlet gcc/ada/ * sem.adb (Walk_Library_Items): Defer processing of main spec after all other specs and before processing bodies. --- diff --git a/gcc/ada/sem.adb b/gcc/ada/sem.adb index e52667fcd7d..2c5c54b7712 100644 --- a/gcc/ada/sem.adb +++ b/gcc/ada/sem.adb @@ -1673,6 +1673,7 @@ package body Sem is pragma Pack (Unit_Number_Set); Main_CU : constant Node_Id := Cunit (Main_Unit); + Spec_CU : Node_Id := Empty; Seen, Done : Unit_Number_Set := (others => False); -- Seen (X) is True after we have seen unit X in the walk. This is used @@ -2146,27 +2147,43 @@ package body Sem is null; when others => - Par := Scope (Defining_Entity (Unit (CU))); - - if Is_Child_Unit (Defining_Entity (Unit (CU))) then - while Present (Par) - and then Par /= Standard_Standard - and then Par /= Cunit_Entity (Main_Unit) - loop - Par := Scope (Par); - end loop; - end if; - if Par /= Cunit_Entity (Main_Unit) then - Do_Unit_And_Dependents (CU, N); - end if; + -- Skip spec of main unit for now, we want to process it + -- after all other specs. + + if Nkind (Unit (CU)) = N_Package_Declaration + and then Library_Unit (CU) = Main_CU + and then CU /= Main_CU + then + Spec_CU := CU; + else + Par := Scope (Defining_Entity (Unit (CU))); + + if Is_Child_Unit (Defining_Entity (Unit (CU))) then + while Present (Par) + and then Par /= Standard_Standard + and then Par /= Cunit_Entity (Main_Unit) + loop + Par := Scope (Par); + end loop; + end if; + if Par /= Cunit_Entity (Main_Unit) then + Do_Unit_And_Dependents (CU, N); + end if; + end if; end case; end; Next_Elmt (Cur); end loop; + -- Now process main package spec if skipped + + if Present (Spec_CU) then + Do_Unit_And_Dependents (Spec_CU, Unit (Spec_CU)); + end if; + -- Now process package bodies on which main depends, followed by bodies -- of parents, if present, and finally main itself.