[v2] PR fortran/105184 - ICE in gfc_array_init_size, at fortran/trans-array.cc:5841
Commit Message
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
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
>
Hi Harald,
> Regtested again with no new failures. OK for mainline?
Looks good to me. Thanks for the patch!
Best regards
Thomas
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
@@ -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)
{
@@ -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)
@@ -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" }
@@ -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
new file mode 100644
@@ -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