From 0e35dea645d5303b433061df1a27e3f205129de7 Mon Sep 17 00:00:00 2001 From: Ghjuvan Lacambre Date: Fri, 5 Jun 2020 18:00:08 +0200 Subject: [PATCH] [Ada] Handle N_Others_Choice case in range-building function gcc/ada/ * sem_case.adb (Build_Choice): Set Is_Static_Expression flag. (Lit_Of): Update specification to mention Is_Static_Expression flag. * sem_ch13.adb (Membership_Entry): Check for N_Others_Choice. --- gcc/ada/sem_case.adb | 6 +++++- gcc/ada/sem_ch13.adb | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/gcc/ada/sem_case.adb b/gcc/ada/sem_case.adb index 953619c..6cda6a9 100644 --- a/gcc/ada/sem_case.adb +++ b/gcc/ada/sem_case.adb @@ -998,7 +998,8 @@ package body Sem_Case is function Lit_Of (Value : Uint) return Node_Id; -- Returns the Node_Id for the enumeration literal corresponding to the - -- position given by Value within the enumeration type Choice_Type. + -- position given by Value within the enumeration type Choice_Type. The + -- returned value has its Is_Static_Expression flag set to true. ------------------ -- Build_Choice -- @@ -1016,6 +1017,7 @@ package body Sem_Case is if Is_Integer_Type (Choice_Type) then Lit_Node := Make_Integer_Literal (Loc, Value1); Set_Etype (Lit_Node, Choice_Type); + Set_Is_Static_Expression (Lit_Node); else Lit_Node := Lit_Of (Value1); end if; @@ -1028,8 +1030,10 @@ package body Sem_Case is if Is_Integer_Type (Choice_Type) then Lo := Make_Integer_Literal (Loc, Value1); Set_Etype (Lo, Choice_Type); + Set_Is_Static_Expression (Lo); Hi := Make_Integer_Literal (Loc, Value2); Set_Etype (Hi, Choice_Type); + Set_Is_Static_Expression (Hi); Lit_Node := Make_Range (Loc, Low_Bound => Lo, diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 01f2a4c..9b7f64e 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -9112,6 +9112,25 @@ package body Sem_Ch13 is return RList'(1 => REnt'(SLo, SHi)); end if; + -- Others case + + elsif Nkind (N) = N_Others_Choice then + declare + Choices : constant List_Id := Others_Discrete_Choices (N); + Choice : Node_Id; + Range_List : RList (1 .. List_Length (Choices)); + + begin + Choice := First (Choices); + + for J in Range_List'Range loop + Range_List (J) := REnt'(Lo_Val (Choice), Hi_Val (Choice)); + Next (Choice); + end loop; + + return Range_List; + end; + -- Static expression case elsif Is_OK_Static_Expression (N) then -- 2.7.4