[v2] PR fortran/105184 - ICE in gfc_array_init_size, at fortran/trans-array.cc:5841

Message ID 00368e5d-a283-0069-fa5e-1f0401516ddf@gmx.de
State New
Headers
Series [v2] PR fortran/105184 - ICE in gfc_array_init_size, at fortran/trans-array.cc:5841 |

Commit Message

Harald Anlauf April 8, 2022, 8:44 p.m. UTC
  Dear all,

Am 06.04.22 um 22:30 schrieb Harald Anlauf via Fortran:
> Dear all,
>
> the logic for checking the allocate-coshape-spec in an ALLOCATE
> statement was sort of sideways, and allowed to pass invalid
> specifications to the code generation.
>
> The fix seems obvious (to me).

after submitting the previous patch, I found another invalid case with
a missing lower bound which was still silently accepted.  The attached
revised patch adds this check, improves the original error message to
actually point to the coarray specification, and renames the testcase
to align better with existing coarray testcases.

> Regtested on x86_64-pc-linux-gnu.  OK for mainline?
> (12 or wait for 13?).

Regtested again with no new failures.  OK for mainline?

Thanks,
Harald
  

Comments

Paul Richard Thomas April 10, 2022, 7:45 a.m. UTC | #1
Hi Harald,

It looks good to me - OK for mainline.

Thanks

Paul


On Fri, 8 Apr 2022 at 21:45, Harald Anlauf via Fortran <fortran@gcc.gnu.org>
wrote:

> Dear all,
>
> Am 06.04.22 um 22:30 schrieb Harald Anlauf via Fortran:
> > Dear all,
> >
> > the logic for checking the allocate-coshape-spec in an ALLOCATE
> > statement was sort of sideways, and allowed to pass invalid
> > specifications to the code generation.
> >
> > The fix seems obvious (to me).
>
> after submitting the previous patch, I found another invalid case with
> a missing lower bound which was still silently accepted.  The attached
> revised patch adds this check, improves the original error message to
> actually point to the coarray specification, and renames the testcase
> to align better with existing coarray testcases.
>
> > Regtested on x86_64-pc-linux-gnu.  OK for mainline?
> > (12 or wait for 13?).
>
> Regtested again with no new failures.  OK for mainline?
>
> Thanks,
> Harald
>
  
Thomas Koenig April 10, 2022, 8:07 a.m. UTC | #2
Hi Harald,

> Regtested again with no new failures.  OK for mainline?

Looks good to me.  Thanks for the patch!

Best regards

	Thomas
  

Patch

From 483cbf9942dcfcf74a912312dbbcda2f108200ea Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Wed, 6 Apr 2022 22:24:21 +0200
Subject: [PATCH] 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.
---
 gcc/fortran/array.cc                          |  7 +++++++
 gcc/fortran/resolve.cc                        | 11 ++++++-----
 gcc/testsuite/gfortran.dg/coarray_44.f90      |  2 ++
 .../gfortran.dg/coarray_allocate_11.f90       |  6 +++---
 .../gfortran.dg/coarray_allocate_12.f90       | 19 +++++++++++++++++++
 5 files changed, 37 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/coarray_allocate_12.f90

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
-- 
2.34.1