From patchwork Wed Dec 16 13:15:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Marie de Rodat X-Patchwork-Id: 1417134 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=adacore.com Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CwwdM0FqTz9sT5 for ; Thu, 17 Dec 2020 00:16:55 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6B1C2383F867; Wed, 16 Dec 2020 13:15:48 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from rock.gnat.com (rock.gnat.com [IPv6:2620:20:4000:0:a9e:1ff:fe9b:1d1]) by sourceware.org (Postfix) with ESMTP id B9D86387090E for ; Wed, 16 Dec 2020 13:15:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B9D86387090E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=derodat@adacore.com Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 6B88B56207; Wed, 16 Dec 2020 08:15:37 -0500 (EST) X-Virus-Scanned: Debian amavisd-new at gnat.com Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 0+1udyGBfv5k; Wed, 16 Dec 2020 08:15:37 -0500 (EST) Received: from tron.gnat.com (tron.gnat.com [IPv6:2620:20:4000:0:46a8:42ff:fe0e:e294]) by rock.gnat.com (Postfix) with ESMTP id 7532D5620D; Wed, 16 Dec 2020 08:15:35 -0500 (EST) Received: by tron.gnat.com (Postfix, from userid 4862) id 74682A6; Wed, 16 Dec 2020 08:15:35 -0500 (EST) Date: Wed, 16 Dec 2020 08:15:35 -0500 From: Pierre-Marie de Rodat To: gcc-patches@gcc.gnu.org Subject: [Ada] Handle iterator filters on loop specifications over containers Message-ID: <20201216131535.GA70076@adacore.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ed Schonberg Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" A loop parameter specification over a container is rewrtten as an iterator specification, so that expansion can use the Iterator opwrations declared for the container type. If an Ada2020 interator filter appears on the loop_parameter_specification it must be transfered to the iterator, and preanalyzed for semantic correctness. Expansion of the filter must be deferred to expansion of the enclosing loop, to prevent premature references to the loop parameter outside of its scope. Tested on x86_64-pc-linux-gnu, committed on trunk gcc/ada/ * sem_ch5.adb (Analyze_Iterator_Specification): If iterator filter is present, preanalyze filter without expansion. (Analyze_Loop_Parameter_Specification): When loop_Parameter_Specification is rewritten as Iterator_Specification, transfer Iterator_Filter if present. diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb --- a/gcc/ada/sem_ch5.adb +++ b/gcc/ada/sem_ch5.adb @@ -2620,7 +2620,10 @@ package body Sem_Ch5 is end if; if Present (Iterator_Filter (N)) then - Analyze_And_Resolve (Iterator_Filter (N), Standard_Boolean); + -- Preanalyze the filter. Expansion will take place when enclosing + -- loop is expanded. + + Preanalyze_And_Resolve (Iterator_Filter (N), Standard_Boolean); end if; end Analyze_Iterator_Specification; @@ -3017,6 +3020,9 @@ package body Sem_Ch5 is begin Set_Iterator_Specification (Scheme, I_Spec); Set_Loop_Parameter_Specification (Scheme, Empty); + Set_Iterator_Filter (I_Spec, + Relocate_Node (Iterator_Filter (N))); + Analyze_Iterator_Specification (I_Spec); -- In a generic context, analyze the original domain of