re PR fortran/72714 ([Coarray] ICE in gfc_array_init_size, at fortran/trans-array...
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 3 Mar 2019 13:16:40 +0000 (13:16 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 3 Mar 2019 13:16:40 +0000 (13:16 +0000)
2019-03-03  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/72714
* resolve.c (resolve_allocate_expr): Add some tests for coarrays.

2019-03-03  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/72714
* gfortran.dg/coarray_allocate_11.f90: New test.

From-SVN: r269352

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

index 1a0ec41..489ae1b 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-03  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/72714
+       * resolve.c (resolve_allocate_expr): Add some tests for coarrays.
+
 2019-03-02  Harald Anlauf  <anlauf@gmx.de>
 
        PR fortran/89516
index 422cec2..955978b 100644 (file)
@@ -7766,13 +7766,54 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec)
 
   if (codimension)
     for (i = ar->dimen; i < ar->dimen + ar->codimen; i++)
-      if (ar->dimen_type[i] == DIMEN_THIS_IMAGE)
-       {
-         gfc_error ("Coarray specification required in ALLOCATE statement "
-                    "at %L", &e->where);
-         goto failure;
-       }
+      {
+       switch (ar->dimen_type[i])
+         {
+         case DIMEN_THIS_IMAGE:
+           gfc_error ("Coarray specification required in ALLOCATE statement "
+                      "at %L", &e->where);
+           goto failure;
+
+         case  DIMEN_RANGE:
+           if (ar->start[i] == 0 || ar->end[i] == 0)
+             {
+               /* If ar->stride[i] is NULL, we issued a previous error.  */
+               if (ar->stride[i] == NULL)
+                 gfc_error ("Bad array specification in ALLOCATE statement "
+                            "at %L", &e->where);
+               goto failure;
+             }
+           else if (gfc_dep_compare_expr (ar->start[i], ar->end[i]) == 1)
+             {
+               gfc_error ("Upper cobound is less than lower cobound at %L",
+                          &ar->start[i]->where);
+               goto failure;
+             }
+           break;
+
+         case DIMEN_ELEMENT:
+           if (ar->start[i]->expr_type == EXPR_CONSTANT)
+             {
+               gcc_assert (ar->start[i]->ts.type == BT_INTEGER);
+               if (mpz_cmp_si (ar->start[i]->value.integer, 1) < 0)
+                 {
+                   gfc_error ("Upper cobound is less than lower cobound "
+                              " of 1 at %L", &ar->start[i]->where);
+                   goto failure;
+                 }
+             }
+           break;
+
+         case DIMEN_STAR:
+           break;
 
+         default:
+           gfc_error ("Bad array specification in ALLOCATE statement at %L",
+                      &e->where);
+           goto failure;
+
+         }
+      }
   for (i = 0; i < ar->dimen; i++)
     {
       if (ar->type == AR_ELEMENT || ar->type == AR_FULL)
index 92c9b1e..e7b54ea 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-03  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/72714
+       * gfortran.dg/coarray_allocate_11.f90: New test.
+
 2019-03-02  Harald Anlauf  <anlauf@gmx.de>
 
        PR fortran/89516
diff --git a/gcc/testsuite/gfortran.dg/coarray_allocate_11.f90 b/gcc/testsuite/gfortran.dg/coarray_allocate_11.f90
new file mode 100644 (file)
index 0000000..0e806f0
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-additional-options -fcoarray=single }
+program p
+   integer, allocatable :: z[:,:]
+   integer :: i
+   allocate (z[1:,*]) ! { dg-error "Bad array specification in ALLOCATE statement" }
+   allocate (z[:2,*]) ! { dg-error "Bad array specification in ALLOCATE statement" }
+   allocate (z[2:1,*]) ! { dg-error "Upper cobound is less than lower cobound" }
+   allocate (z[:0,*]) ! { dg-error "Bad array specification in ALLOCATE statement" }
+   allocate (z[0,*]) ! { dg-error "Upper cobound is less than lower cobound" }
+   allocate (z[1,*]) ! This is OK
+   allocate (z[1:1,*]) ! This is OK
+   allocate (z[i:i,*]) ! This is OK
+   allocate (z[i:i-1,*]) ! { dg-error "Upper cobound is less than lower cobound" }
+end