[Bug fortran/49232] Pointer assignment of stride to CONTIGUOUS pointer not diagnosed as invalid

tkoenig at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Aug 31 21:12:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49232

--- Comment #1 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
Straightforward patch:

Index: expr.c
===================================================================
--- expr.c      (Revision 239218)
+++ expr.c      (Arbeitskopie)
@@ -3764,6 +3764,45 @@
          }
     }

+  /* Warn for suspicious assignments like
+
+     pointer, dimension(:), contiguous :: p
+     p => a(:,:,2)  */
+
+  if (lhs_attr.contiguous)
+    {
+      gfc_array_ref *ar;
+      int i;
+
+      ar = NULL;
+
+      for (ref = rvalue->ref; ref; ref = ref->next)
+       {
+         if (ref->type == REF_ARRAY)
+           {
+             ar = &ref->u.ar;
+             break;
+           }
+       }
+      if (ar->type == AR_SECTION)
+       {
+         for (i = 0; i < ar->dimen; i++)
+           {
+             if (ar->dimen_type[i] == DIMEN_VECTOR)
+               gfc_warning (OPT_Wall, "Assignment to contiguous pointer from"
+                            "vector-subscripted target at %L",
&rvalue->where);
+
+             if (ar->dimen_type[i] == DIMEN_RANGE && ar->end[i]
+                 && (ar->end[i]->expr_type != EXPR_CONSTANT
+                     || (ar->end[i]->expr_type == EXPR_CONSTANT
+                         && mpz_cmp_si (ar->end[i]->value.integer, 1) != 0)))
+               gfc_warning (OPT_Wall, "Assignment to contiguous pointer from "
+                            "possibly non-contiguous target at %L",
+                            &rvalue->where);
+           }
+       }
+    }
+
   /* Warn if it is the LHS pointer may lives longer than the RHS target.  */
   if (warn_target_lifetime
       && rvalue->expr_type == EXPR_VARIABLE

We probably don't want an unconditional error for stuff
p => a(:,:,2) which _could_ just be a pointer to an empty array,
and hence contiguous (but silly). Same thing could hold for
p => a(:,:,n) where n always equals one.

Of course, we could also warn unconditionally instead of depending
on -Wall.

Comments?


More information about the Gcc-bugs mailing list