From 8a116c6539b044ec20bd9fd604887a0a2e21a10e Mon Sep 17 00:00:00 2001 From: Justin Squirek Date: Tue, 9 Jan 2024 15:08:08 +0000 Subject: [PATCH] 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. --- 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 fa2a4cbed395..a2996137648c 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; -- 2.43.5