re PR fortran/69395 (ICE on declaring array with more than 7 dimensions+codimensions)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 16 Mar 2018 02:43:02 +0000 (02:43 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 16 Mar 2018 02:43:02 +0000 (02:43 +0000)
2018-03-15  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/69395
* decl.c (merge_array_spec): Limit the merging to maximum allowed
dimensions, and issue error message if limit is exceeded.

2018-03-15  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/69395
* gfortran.dg/pr69395.f90: New test.

From-SVN: r258580

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr69395.f90 [new file with mode: 0644]

index 19854f1f5742ffa9bf86d7c54bca1fc6bdc6e4c0..6e1af909a5a5e59315bdfed58bae31027096ae83 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-15  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/69395
+       * decl.c (merge_array_spec): Limit the merging to maximum allowed
+       dimensions, and issue error message if limit is exceeded.
+
 2018-03-13  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        * check.c (gfc_check_kill_sub):  Remove check for INTEGER(4) or (8).
index 160964399fc75c25c15a61d2e2d4a4dddefb3ce8..f5e6b31557c66fd8f2943590cba8b5269f3a1060 100644 (file)
@@ -804,7 +804,7 @@ cleanup:
 static bool
 merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
 {
-  int i;
+  int i, j;
 
   if ((from->type == AS_ASSUMED_RANK && to->corank)
       || (to->type == AS_ASSUMED_RANK && from->corank))
@@ -822,8 +822,14 @@ merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
 
       for (i = 0; i < to->corank; i++)
        {
-         to->lower[from->rank + i] = to->lower[i];
-         to->upper[from->rank + i] = to->upper[i];
+         /* Do not exceed the limits on lower[] and upper[].  gfortran
+            cleans up elsewhere.  */
+         j = from->rank + i;
+         if (j >= GFC_MAX_DIMENSIONS)
+           break;
+
+         to->lower[j] = to->lower[i];
+         to->upper[j] = to->upper[i];
        }
       for (i = 0; i < from->rank; i++)
        {
@@ -846,19 +852,33 @@ merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
 
       for (i = 0; i < from->corank; i++)
        {
+         /* Do not exceed the limits on lower[] and upper[].  gfortran
+            cleans up elsewhere.  */
+         j = to->rank + i;
+         if (j >= GFC_MAX_DIMENSIONS)
+           break;
+
          if (copy)
            {
-             to->lower[to->rank + i] = gfc_copy_expr (from->lower[i]);
-             to->upper[to->rank + i] = gfc_copy_expr (from->upper[i]);
+             to->lower[j] = gfc_copy_expr (from->lower[i]);
+             to->upper[j] = gfc_copy_expr (from->upper[i]);
            }
          else
            {
-             to->lower[to->rank + i] = from->lower[i];
-             to->upper[to->rank + i] = from->upper[i];
+             to->lower[j] = from->lower[i];
+             to->upper[j] = from->upper[i];
            }
        }
     }
 
+  if (to->rank + to->corank >= GFC_MAX_DIMENSIONS)
+    {
+      gfc_error ("Sum of array rank %d and corank %d at %C exceeds maximum "
+                "allowed dimensions of %d",
+                to->rank, to->corank, GFC_MAX_DIMENSIONS);
+      to->corank = GFC_MAX_DIMENSIONS - to->rank;
+      return false;
+    }
   return true;
 }
 
index ca6618f2b7279897695c5b697b0faf91d91449db..9db78cd5d120a0b623284d45409336f9ab1e2858 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-15  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/69395
+       * gfortran.dg/pr69395.f90: New test.
+
 2018-03-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/79085
diff --git a/gcc/testsuite/gfortran.dg/pr69395.f90 b/gcc/testsuite/gfortran.dg/pr69395.f90
new file mode 100644 (file)
index 0000000..ea98baa
--- /dev/null
@@ -0,0 +1,5 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+program p
+real, dimension(1,2,1,2,1,2,1,2), codimension[1,2,1,2,1,2,1,*] :: z  ! { dg-error "allowed dimensions" }
+end