From: Eric Botcazou <[email protected]>
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