From 756e05d1565482e7b24f9cf51ffcfeced5a9d91c Mon Sep 17 00:00:00 2001 From: Bob Duff Date: Wed, 18 Oct 2023 09:54:06 -0400 Subject: [PATCH] ada: Compiler crash on early alignment clause This patch fixes a bug: if "for T'Alignment use..." is followed by "for T use ();" the compiler crashes. A workaround is to move the alignment clause after the enumeration rep clause. gcc/ada/ * sem_ch13.ads (Set_Enum_Esize): Do not set alignment. * sem_ch13.adb (Set_Enum_Esize): Do not set alignment. Archaeology seems to show that this line of code dates from when "Alignment = 0" meant "the Alignment is not known at compile time" and "the Alignment is not yet known at compile time" as well as "the Alignment is zero". In any case, it seems to be unnecessary, and in this case harmful, because gigi would crash. Alignment_Clause is set (because there is one), so gigi would query the Alignment, but Alignment was destroyed. --- gcc/ada/sem_ch13.adb | 2 -- gcc/ada/sem_ch13.ads | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 5747ee9c5391..302fab74757a 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -17381,8 +17381,6 @@ package body Sem_Ch13 is Sz : Unat; begin - Reinit_Alignment (T); - -- Find the minimum standard size (8,16,32,64,128) that fits Lo := Enumeration_Rep (Entity (Type_Low_Bound (T))); diff --git a/gcc/ada/sem_ch13.ads b/gcc/ada/sem_ch13.ads index 1386096535ee..555d302fb104 100644 --- a/gcc/ada/sem_ch13.ads +++ b/gcc/ada/sem_ch13.ads @@ -79,8 +79,7 @@ package Sem_Ch13 is procedure Set_Enum_Esize (T : Entity_Id); -- This routine sets the Esize field for an enumeration type T, based -- on the current representation information available for T. Note that - -- the setting of the RM_Size field is not affected. This routine also - -- initializes the alignment field to zero. + -- the setting of the RM_Size field is not affected. Unknown_Minimum_Size : constant Nonzero_Int := -1; -- 2.47.2