diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2010-09-18 22:22:38 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2010-09-18 22:22:38 +0000 |
commit | 46f19baf762ff4140dcfd18a0f424d0cec0e4615 (patch) | |
tree | 61a6595b3301253122f6cc36c08bd9eea906504d /gcc/fortran/frontend-passes.c | |
parent | 1389294cc3eb1e74f9c9418487a451f9f8660b52 (diff) | |
download | gcc-46f19baf762ff4140dcfd18a0f424d0cec0e4615.zip gcc-46f19baf762ff4140dcfd18a0f424d0cec0e4615.tar.gz gcc-46f19baf762ff4140dcfd18a0f424d0cec0e4615.tar.bz2 |
frontend-passes.c (gfc_expr_walker): Handle constructors and references.
2010-09-17 Thomas Koenig <tkoenig@gcc.gnu.org>
* frontend-passes.c (gfc_expr_walker): Handle
constructors and references.
From-SVN: r164403
Diffstat (limited to 'gcc/fortran/frontend-passes.c')
-rw-r--r-- | gcc/fortran/frontend-passes.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index b6a74fd..bfa7a99 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -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 exprfn, void *data) { 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 exprfn, void *data) 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; } |