From patchwork Fri Sep 17 19:34:45 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Koenig X-Patchwork-Id: 65102 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 3EF2EB6F14 for ; Sat, 18 Sep 2010 05:35:00 +1000 (EST) Received: (qmail 7915 invoked by alias); 17 Sep 2010 19:34:56 -0000 Received: (qmail 7788 invoked by uid 22791); 17 Sep 2010 19:34:55 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp6.netcologne.de (HELO smtp6.netcologne.de) (194.8.194.26) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 17 Sep 2010 19:34:49 +0000 Received: from [192.168.0.196] (xdsl-87-79-177-97.netcologne.de [87.79.177.97]) by smtp6.netcologne.de (Postfix) with ESMTP id 4182D2A0D3B; Fri, 17 Sep 2010 21:34:46 +0200 (CEST) Subject: [patch, fortran] Make front end walker more complete From: Thomas Koenig To: fortran@gcc.gnu.org Cc: gcc-patches@gcc.gnu.org, jakub@redhat.com Date: Fri, 17 Sep 2010 21:34:45 +0200 Message-ID: <1284752085.9243.100.camel@linux-fd1f.site> Mime-Version: 1.0 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 Hello world, here's a patch to handle more cases in the front end, pretty self-explanatory. Regression-tested. OK for trunk? 2010-09-17 Thomas Koenig * frontend-passes.c (gfc_expr_walker): Handle constructors and references. Index: frontend-passes.c =================================================================== --- frontend-passes.c (Revision 164345) +++ frontend-passes.c (Arbeitskopie) @@ -24,6 +24,7 @@ along with GCC; see the file COPYING3. If not see #include "arith.h" #include "flags.h" #include "dependency.h" +#include "constructor.h" /* Forward declarations. */ @@ -319,6 +320,9 @@ gfc_expr_walker (gfc_expr **e, walk_expr_fn_t expr { int walk_subtrees = 1; gfc_actual_arglist *a; + gfc_ref *r; + gfc_constructor *c; + int result = exprfn (e, &walk_subtrees, data); if (result) return result; @@ -339,6 +343,60 @@ gfc_expr_walker (gfc_expr **e, walk_expr_fn_t expr for (a = (*e)->value.compcall.actual; a; a = a->next) WALK_SUBEXPR (a->expr); break; + + case EXPR_STRUCTURE: + case EXPR_ARRAY: + for (c = gfc_constructor_first ((*e)->value.constructor); c; + c = gfc_constructor_next (c)) + { + WALK_SUBEXPR (c->expr); + if (c->iterator != NULL) + { + WALK_SUBEXPR (c->iterator->var); + WALK_SUBEXPR (c->iterator->start); + WALK_SUBEXPR (c->iterator->end); + WALK_SUBEXPR (c->iterator->step); + } + } + + if ((*e)->expr_type != EXPR_ARRAY) + break; + + /* Fall through to the variable case in order to walk the + the reference. */ + + case EXPR_VARIABLE: + for (r = (*e)->ref; r; r = r->next) + { + gfc_array_ref *ar; + int i; + + switch (r->type) + { + case REF_ARRAY: + ar = &r->u.ar; + if (ar->type == AR_SECTION || ar->type == AR_ELEMENT) + { + for (i=0; i< ar->dimen; i++) + { + WALK_SUBEXPR (ar->start[i]); + WALK_SUBEXPR (ar->end[i]); + WALK_SUBEXPR (ar->stride[i]); + } + } + + break; + + case REF_SUBSTRING: + WALK_SUBEXPR (r->u.ss.start); + WALK_SUBEXPR (r->u.ss.end); + break; + + case REF_COMPONENT: + break; + } + } + default: break; }