This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/30655] Undue out-of-bounds warning



------- Comment #2 from fxcoudert at gcc dot gnu dot org  2007-01-31 22:05 -------
Around resolve.c:2518:

      if (((compare_bound_int (ar->stride[i], 0) == CMP_GT
            || ar->stride[i] == NULL)
           && compare_bound (AR_START, AR_END) != CMP_GT)
          || (compare_bound_int (ar->stride[i], 0) == CMP_LT
              && compare_bound (AR_START, AR_END) != CMP_LT))

when I wrote that code, I stupidly assumed that compare_bound(...) != CMP_GT
was equivalent to compare_bound(...) == CMP_LT || compare_bound(...) == CMP_EQ,
and it's wrong because there's also CMP_UNKNOWN!

The following trivial patch fixes it (I also create a variable to hold the
comparison of AR_START and AR_END, because we use it multiple times).


Index: resolve.c
===================================================================
--- resolve.c   (revision 121280)
+++ resolve.c   (working copy)
@@ -2499,48 +2499,51 @@
       break;

     case AR_SECTION:
-      if (compare_bound_int (ar->stride[i], 0) == CMP_EQ)
-       {
-         gfc_error ("Illegal stride of zero at %L", &ar->c_where[i]);
-         return FAILURE;
-       }
-
+      {
 #define AR_START (ar->start[i] ? ar->start[i] : as->lower[i])
 #define AR_END (ar->end[i] ? ar->end[i] : as->upper[i])

-      if (compare_bound (AR_START, AR_END) == CMP_EQ
-         && (compare_bound (AR_START, as->lower[i]) == CMP_LT
-             || compare_bound (AR_START, as->upper[i]) == CMP_GT))
-       goto bound;
+       comparison comp_start_end = compare_bound (AR_START, AR_END);

-      if (((compare_bound_int (ar->stride[i], 0) == CMP_GT
-           || ar->stride[i] == NULL)
-          && compare_bound (AR_START, AR_END) != CMP_GT)
-         || (compare_bound_int (ar->stride[i], 0) == CMP_LT
-             && compare_bound (AR_START, AR_END) != CMP_LT))
-       {
-         if (compare_bound (AR_START, as->lower[i]) == CMP_LT)
-           goto bound;
-         if (compare_bound (AR_START, as->upper[i]) == CMP_GT)
-           goto bound;
-       }
+       if (compare_bound_int (ar->stride[i], 0) == CMP_EQ)
+         {
+           gfc_error ("Illegal stride of zero at %L", &ar->c_where[i]);
+           return FAILURE;
+         }

-      mpz_init (last_value);
-      if (compute_last_value_for_triplet (AR_START, AR_END, ar->stride[i],
-                                         last_value))
-       {
-         if (compare_bound_mpz_t (as->lower[i], last_value) == CMP_GT
-             || compare_bound_mpz_t (as->upper[i], last_value) == CMP_LT)
-           {
-             mpz_clear (last_value);
+       if (comp_start_end == CMP_EQ
+           && (compare_bound (AR_START, as->lower[i]) == CMP_LT
+               || compare_bound (AR_START, as->upper[i]) == CMP_GT))
+         goto bound;
+
+       if (((compare_bound_int (ar->stride[i], 0) == CMP_GT
+             || ar->stride[i] == NULL)
+            && (comp_start_end == CMP_LT || comp_start_end == CMP_EQ))
+           || (compare_bound_int (ar->stride[i], 0) == CMP_LT
+               && (comp_start_end == CMP_GT || comp_start_end == CMP_EQ)))
+         {
+           if (compare_bound (AR_START, as->lower[i]) == CMP_LT)
              goto bound;
-           }
-       }
-      mpz_clear (last_value);
+           if (compare_bound (AR_START, as->upper[i]) == CMP_GT)
+             goto bound;
+         }

+       mpz_init (last_value);
+       if (compute_last_value_for_triplet (AR_START, AR_END, ar->stride[i],
+                                           last_value))
+         {
+           if (compare_bound_mpz_t (as->lower[i], last_value) == CMP_GT
+               || compare_bound_mpz_t (as->upper[i], last_value) == CMP_LT)
+             {
+               mpz_clear (last_value);
+               goto bound;
+             }
+         }
+        mpz_clear (last_value);
+
 #undef AR_START
 #undef AR_END
-
+      }
       break;

     default:


-- 

fxcoudert at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2007-01-31 22:05:59
               date|                            |


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]