https://gcc.gnu.org/g:8a116c6539b044ec20bd9fd604887a0a2e21a10e
commit r15-247-g8a116c6539b044ec20bd9fd604887a0a2e21a10e Author: Justin Squirek <squi...@adacore.com> Date: Tue Jan 9 15:08:08 2024 +0000 ada: Bad internal naming when using pragma Compile_Time_Error This patch fixes an error in the compiler whereby the presence of a condition which tests the size of a type not known at compile time within an instance of pragma Compile_Time_Error causes incorrect internal names to be generated for said type during expansion. gcc/ada/ * sem_prag.adb (Defer_Compile_Time_Warning_Error_To_BE): Better handle itypes such that the tree copy required for the expansion of the pragma doesn't cause ordering problems with internal names. Diff: --- gcc/ada/sem_prag.adb | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index fa2a4cbed39..a2996137648 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -33812,7 +33812,23 @@ package body Sem_Prag is -- as 0. if not In_Extended_Main_Code_Unit (N) then - Insert_Library_Level_Action (New_Copy_Tree (N)); + -- We've created an Itype for the string in this pragma and + -- may have made other Itypes. When we copy the entire tree + -- of this pragma, we'll make a second copy of them in its + -- unit, which will mess up the numbering of the remaining + -- internal names. + + declare + Saved_Current_Sem_Unit : constant Unit_Number_Type := + Current_Sem_Unit; + New_N : Node_Id; + + begin + Current_Sem_Unit := Main_Unit; + New_N := New_Copy_Tree (N); + Current_Sem_Unit := Saved_Current_Sem_Unit; + Insert_Library_Level_Action (New_N); + end; end if; end Defer_Compile_Time_Warning_Error_To_BE;