diff options
author | Roger Sayle <roger@eyesopen.com> | 2007-02-02 03:58:58 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2007-02-02 03:58:58 +0000 |
commit | d4f8b5672a9b7349426fc54e27f7ea67a1078081 (patch) | |
tree | 0376647112160df823b457ae54a0a1c271ff2287 /gcc/fortran/dependency.c | |
parent | 2ad62c9b343185a73761936204f5a261c8fbad07 (diff) | |
download | gcc-d4f8b5672a9b7349426fc54e27f7ea67a1078081.tar.gz |
dependency.c (gfc_check_dependency): Implement dependency checking for array constructors.
* dependency.c (gfc_check_dependency) <EXPR_ARRAY>: Implement
dependency checking for array constructors.
* gfortran.dg/dependency_20.f90: New test case.
From-SVN: r121490
Diffstat (limited to 'gcc/fortran/dependency.c')
-rw-r--r-- | gcc/fortran/dependency.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 26314e2035c..b79f2229835 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -599,9 +599,10 @@ gfc_are_equivalenced_arrays (gfc_expr *e1, gfc_expr *e2) int gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical) { + gfc_actual_arglist *actual; + gfc_constructor *c; gfc_ref *ref; int n; - gfc_actual_arglist *actual; gcc_assert (expr1->expr_type == EXPR_VARIABLE); @@ -685,8 +686,19 @@ gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical) return 0; case EXPR_ARRAY: - /* Probably ok in the majority of (constant) cases. */ - return 1; + /* Loop through the array constructor's elements. */ + for (c = expr2->value.constructor; c; c = c->next) + { + /* If this is an iterator, assume the worst. */ + if (c->iterator) + return 1; + /* Avoid recursion in the common case. */ + if (c->expr->expr_type == EXPR_CONSTANT) + continue; + if (gfc_check_dependency (expr1, c->expr, 1)) + return 1; + } + return 0; default: return 1; |