From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by sourceware.org (Postfix) with ESMTPS id 6068F385C301 for ; Mon, 5 Sep 2022 07:26:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6068F385C301 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com Received: by mail-wr1-x431.google.com with SMTP id w5so10049533wrn.12 for ; Mon, 05 Sep 2022 00:26:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :from:to:cc:subject:date; bh=9iLeI3b3BYwza9IrwSP24Z9PdM9CkHlnJBFpiExGt+s=; b=a6FTwdpOV9lY8fwXpZJ8xOYQnY4ELqNUjjMtjwwQPMrLqszLMlQk5ruGAVo6mkJqkC tm9vGtCGE8Vgm20ob/+dM2Ptc56sT/FXDVz12Wyt0++9cR7xn0DSsnsivMdmjGQGJM4a ER+BWmUxENue4bk9GnQnaYYBUuKtMTDiEw2HaQWFkQBiLq9gX5IADoJSahTZ4DrTisE8 5NicZ/yc/YstBPZKczzcELBOnOJgL8g7ZRjW9NrxoePj/ve3YzwQFORUoj1hmY8MbEGi mKo3FdMy/q8sIqkoghXvBD+eh8obK4wcTkRH/8bJPk95JEi0/KOt/Ap4GB8We/ap9FrE 91MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date; bh=9iLeI3b3BYwza9IrwSP24Z9PdM9CkHlnJBFpiExGt+s=; b=y9WvBthq3HMa88w9iIXlkDqQfe8j4i8FQjLDDqkFrFUiwOJknS2Ephm4YirWqHKlHj jWSwY21/w7kzfBEEIiTpWW3648JRs0G5/E7FuRaUMFCDTxlKxOQC0DvwaFq8lqURbecH phWz0jQL879xV9RbydIoo+Ug6icRnE3Bzv9UXLBzim7HLrubWgyKwbPlt7g9f2GwQ2G3 EKoszrgNmlqIASH1GweP/d7W7zbWRjZeFPY8vF5mHW+cUD0ARaNW75fg4hfvzaeY/cE/ Afk5bvhvOFNyCN5tEJPK/7xQb9UyK+LgB7E1lctKOL08b+yN56SqVf0g8g5Bqjg76hWs PWYQ== X-Gm-Message-State: ACgBeo298xagLsLPNMdVP7FvmN4hLjB4uRyLEnUSto9RCYE59W6Ty4zt 4rixutkjvtSrHIiwV8rQtmJAg+vhVYzjwg== X-Google-Smtp-Source: AA6agR6HhytQ91dX0tQi3MWMiZ/c0KlppOClZNSauye1X8KvIvXa6cChBp1PrWVqh7awteRS12Dakg== X-Received: by 2002:a5d:4e11:0:b0:225:8678:fa7c with SMTP id p17-20020a5d4e11000000b002258678fa7cmr24086562wrt.712.1662362766032; Mon, 05 Sep 2022 00:26:06 -0700 (PDT) Received: from poulhies-Precision-5550 (static-176-191-105-132.ftth.abo.bbox.fr. [176.191.105.132]) by smtp.gmail.com with ESMTPSA id k2-20020a5d6d42000000b00226f0a00348sm7949909wri.111.2022.09.05.00.26.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Sep 2022 00:26:05 -0700 (PDT) Date: Mon, 5 Sep 2022 09:26:04 +0200 From: Marc =?iso-8859-1?Q?Poulhi=E8s?= To: gcc-patches@gcc.gnu.org Cc: Piotr Trojanek Subject: [Ada] Fix double identifiers in iterated component association Message-ID: <20220905072604.GA1174699@poulhies-Precision-5550> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="82I3+IH0IqGh5yIs" Content-Disposition: inline X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --82I3+IH0IqGh5yIs Content-Type: text/plain; charset=us-ascii Content-Disposition: inline The iterated_component_association grammar construct appears in Ada RM in two syntactic forms: with iterator_specification and with defining_identifier. This is now properly reflected in the GNAT AST, while previously we had two defining_identifiers regardless of the syntactic form. Cleanup related to handling of iterated_component_association in SPARK. Behavior of the compiler itself should not be affected. Tested on x86_64-pc-linux-gnu, committed on trunk gcc/ada/ * exp_aggr.adb (Two_Pass_Aggregate_Expansion): Expand iterated component association with an unanalyzed copy of iterated expression. The previous code worked only because the expanded loop used both an analyzed copy of the iterator_specification and an analyzed copy of the iterated expression. Now the iterated expression is reanalyzed in the context of the expanded loop. * par-ch4.adb (Build_Iterated_Component_Association): Don't set defining identifier when iterator specification is present. * sem_aggr.adb (Resolve_Iterated_Association): Pick index name from the iterator specification. * sem_elab.adb (Traverse_Potential_Scenario): Handle iterated element association just like iterated component association. Not strictly part of this fix, but still worth for the completeness. * sem_res.adb (Resolve): Pick index name from the iterator specification, when present. * sem_util.adb (Traverse_More): For completeness, just like the change in Traverse_Potential_Scenario. * sinfo.ads (ITERATED_COMPONENT_ASSOCIATION): Fix and complete description. (ITERATED_ELEMENT_ASSOCIATION): Likewise. --82I3+IH0IqGh5yIs Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="patch.diff" diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb --- a/gcc/ada/exp_aggr.adb +++ b/gcc/ada/exp_aggr.adb @@ -6536,7 +6536,7 @@ package body Exp_Aggr is Prefix => New_Occurrence_Of (TmpE, Loc), Expressions => New_List (New_Occurrence_Of (Index_Id, Loc))), - Expression => New_Copy_Tree (Expression (Assoc))); + Expression => Copy_Separate_Tree (Expression (Assoc))); -- Advance index position for insertion. @@ -7500,11 +7500,11 @@ package body Exp_Aggr is -- Iterated_Component_Association. - Loop_Id := - Make_Defining_Identifier (Loc, - Chars => Chars (Defining_Identifier (Comp))); - if Present (Iterator_Specification (Comp)) then + Loop_Id := + Make_Defining_Identifier (Loc, + Chars => Chars (Defining_Identifier + (Iterator_Specification (Comp)))); L_Iteration_Scheme := Make_Iteration_Scheme (Loc, Iterator_Specification => Iterator_Specification (Comp)); @@ -7513,6 +7513,9 @@ package body Exp_Aggr is -- Loop_Parameter_Specification is parsed with a choice list. -- where the range is the first (and only) choice. + Loop_Id := + Make_Defining_Identifier (Loc, + Chars => Chars (Defining_Identifier (Comp))); L_Range := Relocate_Node (First (Discrete_Choices (Comp))); L_Iteration_Scheme := diff --git a/gcc/ada/par-ch4.adb b/gcc/ada/par-ch4.adb --- a/gcc/ada/par-ch4.adb +++ b/gcc/ada/par-ch4.adb @@ -3554,7 +3554,6 @@ package body Ch4 is 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); diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -3053,7 +3053,8 @@ package body Sem_Aggr is elsif Present (Iterator_Specification (Comp)) then Copy := Copy_Separate_Tree (Iterator_Specification (Comp)); - Id_Name := Chars (Defining_Identifier (Comp)); + Id_Name := + Chars (Defining_Identifier (Iterator_Specification (Comp))); Analyze (Copy); Typ := Etype (Defining_Identifier (Copy)); diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb --- a/gcc/ada/sem_elab.adb +++ b/gcc/ada/sem_elab.adb @@ -3339,7 +3339,9 @@ package body Sem_Elab is Traverse_List (Else_Actions (Scen)); elsif Nkind (Scen) in - N_Component_Association | N_Iterated_Component_Association + N_Component_Association + | N_Iterated_Component_Association + | N_Iterated_Element_Association then Traverse_List (Loop_Actions (Scen)); diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -3163,9 +3163,21 @@ package body Sem_Res is = N_Iterated_Component_Association and then Is_Boolean_Type (Typ) then - Error_Msg_N -- CODEFIX - ("missing ALL or SOME in quantified expression", - Defining_Identifier (First (Component_Associations (N)))); + if Present + (Iterator_Specification + (First (Component_Associations (N)))) + then + Error_Msg_N -- CODEFIX + ("missing ALL or SOME in quantified expression", + Defining_Identifier + (Iterator_Specification + (First (Component_Associations (N))))); + else + Error_Msg_N -- CODEFIX + ("missing ALL or SOME in quantified expression", + Defining_Identifier + (First (Component_Associations (N)))); + end if; -- For an operator with no interpretation, check whether -- one of its operands may be a user-defined literal. diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -29500,6 +29500,9 @@ package body Sem_Util is when N_Iterated_Component_Association => Traverse_More (Loop_Actions (Node), Result); + when N_Iterated_Element_Association => + Traverse_More (Loop_Actions (Node), Result); + when N_Iteration_Scheme => Traverse_More (Condition_Actions (Node), Result); diff --git a/gcc/ada/sinfo.ads b/gcc/ada/sinfo.ads --- a/gcc/ada/sinfo.ads +++ b/gcc/ada/sinfo.ads @@ -4183,11 +4183,15 @@ package Sinfo is -- ITERATED_COMPONENT_ASSOCIATION ::= -- for DEFINING_IDENTIFIER in DISCRETE_CHOICE_LIST => EXPRESSION + -- for ITERATOR_SPECIFICATION => EXPRESSION + + -- At most one of (Defining_Identifier, Iterator_Specification) + -- is present at a time, in which case the other one is empty. -- N_Iterated_Component_Association -- Sloc points to FOR -- Defining_Identifier - -- Iterator_Specification (set to Empty if no Iterator_Spec) + -- Iterator_Specification -- Expression -- Discrete_Choices -- Loop_Actions @@ -4207,9 +4211,13 @@ package Sinfo is -- Etype --------------------------------- - -- 3.4.5 Comtainer_Aggregates -- + -- 3.4.5 Container_Aggregates -- --------------------------------- + -- ITERATED_ELEMENT_ASSOCIATION ::= + -- for LOOP_PARAMETER_SPECIFICATION[ use KEY_EXPRESSION] => EXPRESSION + -- | for ITERATOR_SPECIFICATION[ use KEY_EXPRESSION] => EXPRESSION + -- N_Iterated_Element_Association -- Key_Expression -- Iterator_Specification --82I3+IH0IqGh5yIs--