------- Comment #7 from pault at gcc dot gnu dot org  2007-04-30 12:06 -------
Thomas,

I believe this one is OK - it needs cleaning up with gfc_dep_compare_expr's, as
appropriate. It regtests OK.

Index: gcc/fortran/dependency.c
===================================================================
*** gcc/fortran/dependency.c    (revision 124192)
--- gcc/fortran/dependency.c    (working copy)
*************** gfc_full_array_ref_p (gfc_ref *ref)
*** 1117,1128 ****

    if (ref->type != REF_ARRAY)
      return false;
    if (ref->u.ar.type == AR_FULL)
      return true;
    if (ref->u.ar.type != AR_SECTION)
      return false;
-   if (ref->next)
-     return false;

    for (i = 0; i < ref->u.ar.dimen; i++)
      {
--- 1117,1128 ----

    if (ref->type != REF_ARRAY)
      return false;
+   if (ref->next)
+     return false;
    if (ref->u.ar.type == AR_FULL)
      return true;
    if (ref->u.ar.type != AR_SECTION)
      return false;

    for (i = 0; i < ref->u.ar.dimen; i++)
      {
*************** gfc_full_array_ref_p (gfc_ref *ref)
*** 1143,1148 ****
--- 1143,1161 ----
        /* Check the stride.  */
        if (ref->u.ar.stride[i] && !gfc_expr_is_one (ref->u.ar.stride[i], 0))
        return false;
+
+       /* Check that this is not an array element of an array with range
+        greater than one.  */
+       if (ref->u.ar.dimen_type[i] == DIMEN_ELEMENT
+           && ref->u.ar.as->lower[i]
+           && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT
+           && ((ref->u.ar.as->upper[i]
+                 && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT
+                 && mpz_cmp (ref->u.ar.as->lower[i]->value.integer,
+                             ref->u.ar.as->upper[i]->value.integer))
+                   ||
+                 mpz_cmp_si (ref->u.ar.as->lower[i]->value.integer, 1)))
+       return false;
      }
    return true;
  }

Paul


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31732

Reply via email to