From 776afaf7fef4e8d73a2376778c648f8f9a6c536b Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Mon, 4 May 2020 20:05:03 -0400 Subject: [PATCH] [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. --- gcc/ada/sem_ch3.adb | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) 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 -- 2.30.2