From: Eric Botcazou <ebotca...@adacore.com>

This removes the code dealing with generic main units from the body of the
instantiation routine, namely Instantiate_Bodies, and replaces it by tests
done earlier in the processing.

The test added to Need_Subprogram_Instance_Body is already present in the
twin predicate Needs_Body_Instantiated.

gcc/ada/ChangeLog:

        * inline.adb (Instantiate_Body): Do not call Add_Scope_To_Clean if
        the main unit is generic.
        (Instantiate_Bodies): Do not deal with generic main units here.
        * sem_ch12.adb (Need_Subprogram_Instance_Body): Return false if the
        main unit is generic.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/inline.adb   | 30 ++++++++++--------------------
 gcc/ada/sem_ch12.adb |  4 ++++
 2 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/gcc/ada/inline.adb b/gcc/ada/inline.adb
index abb49b51e63..0e6cf4df3b7 100644
--- a/gcc/ada/inline.adb
+++ b/gcc/ada/inline.adb
@@ -4924,11 +4924,17 @@ package body Inline is
               and then Ekind (Info.Fin_Scop) = E_Package_Body
             then
                Set_In_Package_Body (Spec_Entity (Info.Fin_Scop), True);
+               Instantiate_Package_Body (Info);
+               Set_In_Package_Body (Spec_Entity (Info.Fin_Scop), False);
+            else
+               Instantiate_Package_Body (Info);
             end if;
 
-            Instantiate_Package_Body (Info);
+            --  No need to generate cleanups if the main unit is generic
 
-            if Present (Info.Fin_Scop) then
+            if Present (Info.Fin_Scop)
+               and then not Is_Generic_Unit (Main_Unit_Entity)
+            then
                Scop := Info.Fin_Scop;
 
                --  If the enclosing finalization scope is dynamic, the instance
@@ -4941,12 +4947,6 @@ package body Inline is
                end if;
 
                Add_Scope_To_Clean (Scop);
-
-               --  Reset the In_Package_Body flag if it was set above
-
-               if Ekind (Info.Fin_Scop) = E_Package_Body then
-                  Set_In_Package_Body (Spec_Entity (Info.Fin_Scop), False);
-               end if;
             end if;
 
          --  For subprogram instances, always instantiate the body
@@ -4967,10 +4967,6 @@ package body Inline is
          Push_Scope (Standard_Standard);
          To_Clean := New_Elmt_List;
 
-         if Is_Generic_Unit (Cunit_Entity (Main_Unit)) then
-            Start_Generic;
-         end if;
-
          --  A body instantiation may generate additional instantiations, so
          --  the following loop must scan to the end of a possibly expanding
          --  set (that's why we cannot simply use a FOR loop here). We must
@@ -5009,16 +5005,10 @@ package body Inline is
             Pending_Instantiations.Init;
          end if;
 
-         --  We can now complete the cleanup actions of scopes that contain
-         --  pending instantiations (skipped for generic units, since we
-         --  never need any cleanups in generic units).
+         --  Expand the cleanup actions of scopes that contain instantiations
 
-         if Expander_Active
-           and then not Is_Generic_Unit (Main_Unit_Entity)
-         then
+         if Expander_Active then
             Cleanup_Scopes;
-         elsif Is_Generic_Unit (Cunit_Entity (Main_Unit)) then
-            End_Generic;
          end if;
 
          Pop_Scope;
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 017bcba42ef..1d947806336 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -6032,6 +6032,10 @@ package body Sem_Ch12 is
 
       if (Is_In_Main_Unit (N) or else Is_Inlined_Or_Child_Of_Inlined (Subp))
 
+        --  No need to instantiate bodies in generic units
+
+        and then not Is_Generic_Unit (Cunit_Entity (Main_Unit))
+
         --  Must be generating code or analyzing code in GNATprove mode
 
         and then (Operating_Mode = Generate_Code
-- 
2.43.0

Reply via email to