[gcc(refs/users/marxin/heads/slp-function-v2)] [Ada] Wrong walk order in Walk_Library_Items

Martin Liska marxin@gcc.gnu.org
Thu Jun 11 09:50:21 GMT 2020


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

commit c21938bee0d0a5cb3da442d3d4500d2eeb416b44
Author: Arnaud Charlet <charlet@adacore.com>
Date:   Fri Jan 24 11:58:35 2020 -0500

    [Ada] Wrong walk order in Walk_Library_Items
    
    2020-06-04  Arnaud Charlet  <charlet@adacore.com>
    
    gcc/ada/
    
            * sem.adb (Walk_Library_Items): Defer processing of main spec
            after all other specs and before processing bodies.

Diff:
---
 gcc/ada/sem.adb | 43 ++++++++++++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 13 deletions(-)

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.


More information about the Gcc-cvs mailing list