From patchwork Sat Jul 21 10:13:49 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikael Morin X-Patchwork-Id: 172419 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id BB6642C0330 for ; Sat, 21 Jul 2012 20:16:19 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1343470580; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: References:In-Reply-To:Content-Type:Mailing-List:Precedence: List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=+8aN/Hi3NmxvHc+nC1W/KMRX9OA=; b=OM5RYZW6IniymyY wyOOGxhExYtMUUxel4OVN5q2envoUIqhKfDQV7Byt/iRc3x/3ZhrPloQK7G5h+K4 jsBMdtQNW0+PEWmRtGK5FY1jqD8B2NfLI7pFnlYr2GNG9+PwKGW2cBPhKIhlXbNO QiU3p5B/8N/fhwuYx/iUvfHRdqRk= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:X-SFR-UUID:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:References:In-Reply-To:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=EKGjnE8VHe7EQxKGllNQ+I2Bv0v4du29JDA6+4sAYiJNYSyLZ02LVYVX8GPbo1 Vyv0JxzK9JJ778n30jcB9+KLcFi7yBKFNfqD8UhqxgGEi9U5cEAmS9vCB9oOnS+W MGx+7xNZ6VI7VAnwEL86q5irgLbDM9KneASCa3RmjszZE=; Received: (qmail 10380 invoked by alias); 21 Jul 2012 10:16:12 -0000 Received: (qmail 10359 invoked by uid 22791); 21 Jul 2012 10:16:09 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL, BAYES_00, KHOP_THREADED, RCVD_IN_DNSWL_NONE, TW_TM, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp24.services.sfr.fr (HELO smtp24.services.sfr.fr) (93.17.128.84) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 21 Jul 2012 10:15:52 +0000 Received: from filter.sfr.fr (localhost [127.0.0.1]) by msfrf2414.sfr.fr (SMTP Server) with ESMTP id 008077000062; Sat, 21 Jul 2012 12:15:51 +0200 (CEST) Received: from [192.168.1.58] (37.15.72.86.rev.sfr.net [86.72.15.37]) by msfrf2414.sfr.fr (SMTP Server) with ESMTP id 85DF570000AB; Sat, 21 Jul 2012 12:15:50 +0200 (CEST) X-SFR-UUID: 20120721101550548.85DF570000AB@msfrf2414.sfr.fr Message-ID: <500A80DD.9050307@sfr.fr> Date: Sat, 21 Jul 2012 12:13:49 +0200 From: Mikael Morin User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.5) Gecko/20120709 Thunderbird/10.0.5 MIME-Version: 1.0 To: gfortran , gcc-patches Subject: Re: [Patch, fortran] PR44354 implied-do-loop array constructors using the induction variable in the bounds References: <5009A06F.20905@sfr.fr> <5009B976.7080906@sfr.fr> In-Reply-To: <5009B976.7080906@sfr.fr> X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On 20/07/2012 22:03, Mikael Morin wrote: > On 20/07/2012 20:16, Mikael Morin wrote: >> I have started a regression test. >> OK for trunk if it passes? >> > Unfortunately, it fails with errors like: > > /home/mik/gcc4x/src/gcc/testsuite/gfortran.dg/char_pack_1.f90:55.10: > > do i = i + 1, nv > 1 > Warning: AC-IMPLIED-DO initial expression references control variable at > (1) > > FAIL: gfortran.dg/char_pack_1.f90 -O3 -fomit-frame-pointer (test for > excess errors) Here is another attempt. I moved the diagnostic code from gfc_resolve_iterator to resolve_array_list, so that it doesn't trigger for do loops. Regression test in progress. OK? Mikael 2012-07-20 Mikael Morin PR fortran/44354 * trans-array.c (gfc_trans_array_constructor_value): Evaluate the iteration bounds before the inner variable shadows the outer. 2012-07-20 Mikael Morin PR fortran/44354 * gfortran.dg/array_constructor_39.f90: New test. diff --git a/trans-array.c b/trans-array.c index d289ac3..4aaed15 100644 --- a/trans-array.c +++ b/trans-array.c @@ -1511,6 +1511,9 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type, bool dynamic) { tree tmp; + tree start = NULL_TREE; + tree end = NULL_TREE; + tree step = NULL_TREE; stmtblock_t body; gfc_se se; mpz_t size; @@ -1533,8 +1536,30 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type, expression in an interface mapping. */ if (c->iterator) { - gfc_symbol *sym = c->iterator->var->symtree->n.sym; - tree type = gfc_typenode_for_spec (&sym->ts); + gfc_symbol *sym; + tree type; + + /* Evaluate loop bounds before substituting the loop variable + in case they depend on it. Such a case is invalid, but it is + not more expensive to do the right thing here. + See PR 44354. */ + gfc_init_se (&se, NULL); + gfc_conv_expr_val (&se, c->iterator->start); + gfc_add_block_to_block (pblock, &se.pre); + start = gfc_evaluate_now (se.expr, pblock); + + gfc_init_se (&se, NULL); + gfc_conv_expr_val (&se, c->iterator->end); + gfc_add_block_to_block (pblock, &se.pre); + end = gfc_evaluate_now (se.expr, pblock); + + gfc_init_se (&se, NULL); + gfc_conv_expr_val (&se, c->iterator->step); + gfc_add_block_to_block (pblock, &se.pre); + step = gfc_evaluate_now (se.expr, pblock); + + sym = c->iterator->var->symtree->n.sym; + type = gfc_typenode_for_spec (&sym->ts); shadow_loopvar = gfc_create_var (type, "shadow_loopvar"); gfc_shadow_sym (sym, shadow_loopvar, &saved_loopvar); @@ -1669,8 +1694,6 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type, /* Build the implied do-loop. */ stmtblock_t implied_do_block; tree cond; - tree end; - tree step; tree exit_label; tree loopbody; tree tmp2; @@ -1682,20 +1705,7 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type, gfc_start_block(&implied_do_block); /* Initialize the loop. */ - gfc_init_se (&se, NULL); - gfc_conv_expr_val (&se, c->iterator->start); - gfc_add_block_to_block (&implied_do_block, &se.pre); - gfc_add_modify (&implied_do_block, shadow_loopvar, se.expr); - - gfc_init_se (&se, NULL); - gfc_conv_expr_val (&se, c->iterator->end); - gfc_add_block_to_block (&implied_do_block, &se.pre); - end = gfc_evaluate_now (se.expr, &implied_do_block); - - gfc_init_se (&se, NULL); - gfc_conv_expr_val (&se, c->iterator->step); - gfc_add_block_to_block (&implied_do_block, &se.pre); - step = gfc_evaluate_now (se.expr, &implied_do_block); + gfc_add_modify (&implied_do_block, shadow_loopvar, start); /* If this array expands dynamically, and the number of iterations is not constant, we won't have allocated space for the static