public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-8073] Fortran: fix checking of coshape specification in ALLOCATE statement
@ 2022-04-10 18:28 Harald Anlauf
  0 siblings, 0 replies; only message in thread
From: Harald Anlauf @ 2022-04-10 18:28 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:54c5e064cc3dc3c9b3dff12b6d48dc3efd482b07

commit r12-8073-g54c5e064cc3dc3c9b3dff12b6d48dc3efd482b07
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Wed Apr 6 22:24:21 2022 +0200

    Fortran: fix checking of coshape specification in ALLOCATE statement
    
    gcc/fortran/ChangeLog:
    
            PR fortran/105184
            * array.cc (match_subscript): Reject assumed size coarray
            specification with missing lower bound.
            * resolve.cc (resolve_allocate_expr): Fix logic for checking
            allocate-coshape-spec in ALLOCATE statement.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/105184
            * gfortran.dg/coarray_44.f90: Adjust expected output.
            * gfortran.dg/coarray_allocate_11.f90: Likewise.
            * gfortran.dg/coarray_allocate_12.f90: New test.

Diff:
---
 gcc/fortran/array.cc                              |  7 +++++++
 gcc/fortran/resolve.cc                            | 11 ++++++-----
 gcc/testsuite/gfortran.dg/coarray_44.f90          |  2 ++
 gcc/testsuite/gfortran.dg/coarray_allocate_11.f90 |  6 +++---
 gcc/testsuite/gfortran.dg/coarray_allocate_12.f90 | 19 +++++++++++++++++++
 5 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/gcc/fortran/array.cc b/gcc/fortran/array.cc
index eb9ed8580a0..90ea812d699 100644
--- a/gcc/fortran/array.cc
+++ b/gcc/fortran/array.cc
@@ -134,6 +134,13 @@ end_element:
   if (m == MATCH_ERROR)
     return MATCH_ERROR;
 
+  if (star && ar->start[i] == NULL)
+    {
+      gfc_error ("Missing lower bound in assumed size "
+		 "coarray specification at %C");
+      return MATCH_ERROR;
+    }
+
   /* See if we have an optional stride.  */
   if (gfc_match_char (':') == MATCH_YES)
     {
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 21c8797c938..05f8f1bf6c2 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -8108,12 +8108,13 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec)
 	    goto failure;
 
 	  case  DIMEN_RANGE:
-	    if (ar->start[i] == 0 || ar->end[i] == 0)
+	    /* F2018:R937:
+	     * allocate-coshape-spec is [ lower-bound-expr : ] upper-bound-expr
+	     */
+	    if (ar->start[i] == 0 || ar->end[i] == 0 || ar->stride[i] != NULL)
 	      {
-		/* 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);
+		gfc_error ("Bad coarray specification in ALLOCATE statement "
+			   "at %L", &e->where);
 		goto failure;
 	      }
 	    else if (gfc_dep_compare_expr (ar->start[i], ar->end[i]) == 1)
diff --git a/gcc/testsuite/gfortran.dg/coarray_44.f90 b/gcc/testsuite/gfortran.dg/coarray_44.f90
index 15fb8c76ce4..545b5462251 100644
--- a/gcc/testsuite/gfortran.dg/coarray_44.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_44.f90
@@ -10,3 +10,5 @@ program pr70071
   allocate (z(2)[1::2,*])  ! { dg-error "Bad array dimension" }
   allocate (z(1::2)[2,*])  ! { dg-error "Bad array specification in ALLOCATE" }
 end program pr70071
+
+! { dg-prune-output "Bad coarray specification in ALLOCATE statement" }
diff --git a/gcc/testsuite/gfortran.dg/coarray_allocate_11.f90 b/gcc/testsuite/gfortran.dg/coarray_allocate_11.f90
index 0e806f0955b..0e4f64e1e3d 100644
--- a/gcc/testsuite/gfortran.dg/coarray_allocate_11.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_allocate_11.f90
@@ -3,10 +3,10 @@
 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[1:,*]) ! { dg-error "Bad coarray specification in ALLOCATE statement" }
+   allocate (z[:2,*]) ! { dg-error "Bad coarray 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 "Bad coarray 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
diff --git a/gcc/testsuite/gfortran.dg/coarray_allocate_12.f90 b/gcc/testsuite/gfortran.dg/coarray_allocate_12.f90
new file mode 100644
index 00000000000..2169aa19998
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_allocate_12.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+!
+! PR fortran/105184
+! Based on testcases by Gerhard Steinmetz
+
+program p
+  real, allocatable :: x[:,:]
+  integer :: n = 2
+  allocate (x[  n, *])
+  allocate (x[1:n, *])
+  allocate (x[n:n, *])
+  allocate (x[n, 5:*])
+  allocate (x[ :n,   *]) ! { dg-error "Bad coarray specification" }
+  allocate (x[::n,   *]) ! { dg-error "Bad coarray specification" }
+  allocate (x[ :1:1, *]) ! { dg-error "Bad coarray specification" }
+  allocate (x[1:n:n, *]) ! { dg-error "Bad coarray specification" }
+  allocate (x[1,   : *]) ! { dg-error "Missing lower bound" }
+end


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-04-10 18:28 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-10 18:28 [gcc r12-8073] Fortran: fix checking of coshape specification in ALLOCATE statement Harald Anlauf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).