From: Eric Botcazou Date: Thu, 27 Mar 2025 12:27:46 +0000 (+0100) Subject: ada: Small cleanup in instantiation of generic bodies X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f6b0d91f750011f4472656a2ec7934f511af404;p=thirdparty%2Fgcc.git ada: Small cleanup in instantiation of generic bodies 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. --- 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