re PR fortran/70071 (ICE on wrong usage of a subscript triplet)
authorHarald Anlauf <anlauf@gmx.de>
Thu, 6 Jul 2017 19:49:33 +0000 (19:49 +0000)
committerJanus Weil <janus@gcc.gnu.org>
Thu, 6 Jul 2017 19:49:33 +0000 (21:49 +0200)
2017-07-06  Harald Anlauf  <anlauf@gmx.de>

PR fortran/70071
* array.c (gfc_ref_dimen_size): Handle bad subscript triplets.

2017-07-06  Harald Anlauf  <anlauf@gmx.de>

PR fortran/70071
* gfortran.dg/coarray_44.f90: New testcase.

From-SVN: r250039

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

index 692b8ff..dc89407 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-06  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/70071
+       * array.c (gfc_ref_dimen_size): Handle bad subscript triplets.
+
 2017-07-03  Dominique d'Humieres  <dominiq@lps.ens.fr>
 
        PR fortran/79866
index 30656c1..46642bb 100644 (file)
@@ -2203,9 +2203,15 @@ gfc_ref_dimen_size (gfc_array_ref *ar, int dimen, mpz_t *result, mpz_t *end)
   bool t;
   gfc_expr *stride_expr = NULL;
 
-  if (dimen < 0 || ar == NULL || dimen > ar->dimen - 1)
+  if (dimen < 0 || ar == NULL)
     gfc_internal_error ("gfc_ref_dimen_size(): Bad dimension");
 
+  if (dimen > ar->dimen - 1)
+    {
+      gfc_error ("Bad array dimension at %L", &ar->c_where[dimen]);
+      return false;
+    }
+
   switch (ar->dimen_type[dimen])
     {
     case DIMEN_ELEMENT:
index ac18d1a..f0f068b 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-06  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/70071
+       * gfortran.dg/coarray_44.f90: New testcase.
+
 2017-07-06  Maxim Ostapenko  <m.ostapenko@samsung.com>
 
        * c-c++-common/asan/kasan-alloca-1.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/coarray_44.f90 b/gcc/testsuite/gfortran.dg/coarray_44.f90
new file mode 100644 (file)
index 0000000..15fb8c7
--- /dev/null
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+!
+! PR fortran/70071
+! Based on testcases by Gerhard Steinmetz
+
+program pr70071
+  implicit none
+  integer, allocatable :: z(:)[:,:]
+  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