From: Ed Schonberg Date: Tue, 5 May 2020 00:05:03 +0000 (-0400) Subject: [Ada] Crash on declaration with aggregate for unchecked union X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=776afaf7fef4e8d73a2376778c648f8f9a6c536b;p=gcc.git [Ada] Crash on declaration with aggregate for unchecked union gcc/ada/ * sem_ch3.adb (Analyze_Object_Declaration): If the type is an Unchecked_Union, and the expression is an aggregate. complete the analysis and resolution of the aggregate, and treat like a regular object declaration, instead of as a renaming declarattion. --- diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 9e60d75152d..c105f3c83e8 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -4564,16 +4564,26 @@ package body Sem_Ch3 is Set_Ekind (Id, E_Variable); end if; - Rewrite (N, - Make_Object_Renaming_Declaration (Loc, - Defining_Identifier => Id, - Subtype_Mark => New_Occurrence_Of (T, Loc), - Name => E)); - - Set_Renamed_Object (Id, E); - Freeze_Before (N, T); - Set_Is_Frozen (Id); - goto Leave; + -- If the expression is an aggregate it contains the required + -- discriminant values but it has not been resolved yet, so do + -- it now, and treat it as the initial expression of an object + -- declaration, rather than a renaming. + + if Nkind (E) = N_Aggregate then + Analyze_And_Resolve (E, T); + + else + Rewrite (N, + Make_Object_Renaming_Declaration (Loc, + Defining_Identifier => Id, + Subtype_Mark => New_Occurrence_Of (T, Loc), + Name => E)); + + Set_Renamed_Object (Id, E); + Freeze_Before (N, T); + Set_Is_Frozen (Id); + goto Leave; + end if; else -- Ensure that the generated subtype has a unique external name