From 439dae60ebf25ad432e9a654d10e10581771713a Mon Sep 17 00:00:00 2001 From: Bob Duff Date: Thu, 9 Sep 2021 12:24:32 -0400 Subject: [PATCH] [Ada] Improve message on missing all/for in pre-Ada-2022 modes gcc/ada/ * par-ch4.adb (P_Iterated_Component_Association): Parse these features the same way in all language versions. Move the call to Error_Msg_Ada_2022_Feature into semantic analysis. * sem_aggr.adb (Resolve_Iterated_Component_Association, Resolve_Iterated_Association): Move the call to Error_Msg_Ada_2022_Feature here from par-ch4.adb. --- gcc/ada/par-ch4.adb | 88 ++++++++++++++++++++++---------------------- gcc/ada/sem_aggr.adb | 5 +++ 2 files changed, 49 insertions(+), 44 deletions(-) diff --git a/gcc/ada/par-ch4.adb b/gcc/ada/par-ch4.adb index 20f8dd14eba6..b6cc1a0729dd 100644 --- a/gcc/ada/par-ch4.adb +++ b/gcc/ada/par-ch4.adb @@ -3518,62 +3518,62 @@ package body Ch4 is Assoc_Node := New_Node (N_Iterated_Component_Association, Prev_Token_Ptr); - if Token = Tok_In then - Set_Defining_Identifier (Assoc_Node, Id); - T_In; - Set_Discrete_Choices (Assoc_Node, P_Discrete_Choice_List); + case Token is + when Tok_In => + Set_Defining_Identifier (Assoc_Node, Id); + T_In; + Set_Discrete_Choices (Assoc_Node, P_Discrete_Choice_List); - -- The iterator may include a filter + -- The iterator may include a filter - if Token = Tok_When then - Scan; -- past WHEN - Filter := P_Condition; - end if; + if Token = Tok_When then + Scan; -- past WHEN + Filter := P_Condition; + end if; - if Token = Tok_Use then + if Token = Tok_Use then - -- Ada 2022 Key-expression is present, rewrite node as an - -- Iterated_Element_Association. + -- Ada 2022 Key-expression is present, rewrite node as an + -- Iterated_Element_Association. - Scan; -- past USE - Build_Iterated_Element_Association; - Set_Key_Expression (Assoc_Node, P_Expression); + Scan; -- past USE + Build_Iterated_Element_Association; + Set_Key_Expression (Assoc_Node, P_Expression); - elsif Present (Filter) then - -- A loop_parameter_specification also indicates an Ada 2022 - -- construct, in contrast with a subtype indication used in - -- array aggregates. + elsif Present (Filter) then + -- A loop_parameter_specification also indicates an Ada 2022 + -- construct, in contrast with a subtype indication used in + -- array aggregates. - Build_Iterated_Element_Association; - end if; + Build_Iterated_Element_Association; + end if; - TF_Arrow; - Set_Expression (Assoc_Node, P_Expression); + TF_Arrow; + Set_Expression (Assoc_Node, P_Expression); - elsif Ada_Version >= Ada_2022 - and then Token = Tok_Of - then - Restore_Scan_State (State); - Scan; -- past OF - Set_Defining_Identifier (Assoc_Node, Id); - Iter_Spec := P_Iterator_Specification (Id); - Set_Iterator_Specification (Assoc_Node, Iter_Spec); - - if Token = Tok_Use then - Scan; -- past USE - -- This is an iterated_element_association - - Assoc_Node := - New_Node (N_Iterated_Element_Association, Prev_Token_Ptr); + when Tok_Of => + Restore_Scan_State (State); + Scan; -- past OF + Set_Defining_Identifier (Assoc_Node, Id); + Iter_Spec := P_Iterator_Specification (Id); Set_Iterator_Specification (Assoc_Node, Iter_Spec); - Set_Key_Expression (Assoc_Node, P_Expression); - end if; - TF_Arrow; - Set_Expression (Assoc_Node, P_Expression); - end if; + if Token = Tok_Use then + Scan; -- past USE + -- This is an iterated_element_association - Error_Msg_Ada_2022_Feature ("iterated component", Token_Ptr); + Assoc_Node := + New_Node (N_Iterated_Element_Association, Prev_Token_Ptr); + Set_Iterator_Specification (Assoc_Node, Iter_Spec); + Set_Key_Expression (Assoc_Node, P_Expression); + end if; + + TF_Arrow; + Set_Expression (Assoc_Node, P_Expression); + + when others => + Error_Msg_AP ("missing IN or OF"); + end case; return Assoc_Node; end P_Iterated_Component_Association; diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb index 752b84d6b48a..3283fbbb8d95 100644 --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -1640,6 +1640,8 @@ package body Sem_Aggr is -- Start of processing for Resolve_Iterated_Component_Association begin + Error_Msg_Ada_2022_Feature ("iterated component", Loc); + if Present (Iterator_Specification (N)) then Analyze (Name (Iterator_Specification (N))); @@ -2867,6 +2869,7 @@ package body Sem_Aggr is Key_Type : Entity_Id; Elmt_Type : Entity_Id) is + Loc : constant Source_Ptr := Sloc (N); Choice : Node_Id; Ent : Entity_Id; Expr : Node_Id; @@ -2877,6 +2880,8 @@ package body Sem_Aggr is Typ : Entity_Id := Empty; begin + Error_Msg_Ada_2022_Feature ("iterated component", Loc); + -- If this is an Iterated_Element_Association then either a -- an Iterator_Specification or a Loop_Parameter specification -- is present. In both cases a Key_Expression is present. -- 2.43.5