From: Javier Miranda Date: Fri, 15 Aug 2025 10:33:46 +0000 (+0000) Subject: ada: Crash on null aggregate of multidimensional type X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f2ba38d3babe484b65726cea9f750a57f4951228;p=thirdparty%2Fgcc.git ada: Crash on null aggregate of multidimensional type A compiler built with assertions enabled crashes processing a null aggregate of multidimensional type. gcc/ada/ChangeLog: * sem_aggr.adb (Report_Null_Array_Constraint_Error): Adjust code for reporting the error on enumeration types. (Resolve_Null_Array_Aggregate): On multidimiensional arrays, avoid reporting the same error several times. Flag the node as raising constraint error when the bounds are known and some of them is known to raise constraint error. --- diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb index bbd0eaefb98..baca06800ab 100644 --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -1139,7 +1139,8 @@ package body Sem_Aggr is if Is_Modular_Integer_Type (Index_Typ) then Error_Msg_N ("null array aggregate indexed by a modular type<<", N); - else + + elsif Is_Enumeration_Type (Index_Typ) then Error_Msg_N ("null array aggregate indexed by an enumeration type<<", N); end if; @@ -5463,8 +5464,13 @@ package body Sem_Aggr is Hi := New_Copy_Tree (Lo); - Report_Null_Array_Constraint_Error (N, Index_Typ); - Set_Raises_Constraint_Error (N); + -- On multidimiensional arrays, avoid reporting the same error + -- several times. + + if not Raises_Constraint_Error (N) then + Report_Null_Array_Constraint_Error (N, Index_Typ); + Set_Raises_Constraint_Error (N); + end if; else -- The upper bound is the predecessor of the lower bound @@ -5478,6 +5484,15 @@ package body Sem_Aggr is Append (Make_Range (Loc, New_Copy_Tree (Lo), Hi), Constr); Analyze_And_Resolve (Last (Constr), Etype (Index)); + if Known_Bounds + and then + (Nkind (High_Bound (Last (Constr))) = N_Raise_Constraint_Error + or else + Nkind (Low_Bound (Last (Constr))) = N_Raise_Constraint_Error) + then + Set_Raises_Constraint_Error (N); + end if; + Next_Index (Index); end loop;