re PR fortran/85111 (ICE in min_max_choose, at fortran/simplify.c:4884 (and others))
authorThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 30 Mar 2018 09:56:46 +0000 (09:56 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 30 Mar 2018 09:56:46 +0000 (09:56 +0000)
2017-03-30  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/85111
* array.c (gfc_resolve_character_array_constructor): Early
exit for zero-size arrays.
* simplify.c (simplify_transformation_to_array): Exit early
if the result size is zero.
(simplify_minmaxloc_to_array): Likewise.

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

PR fortran/85111
* gfortran.dg/zero_sized_10.f90: New test.

From-SVN: r258973

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

index ee13d92fc92e2b58ab127b359b340d41bc89643a..58d611ba4f57307d36a15dc6fdd5b6e5baa8705e 100644 (file)
@@ -2003,6 +2003,20 @@ gfc_resolve_character_array_constructor (gfc_expr *expr)
 
 got_charlen:
 
+  /* Early exit for zero size arrays. */
+  if (expr->shape)
+    {
+      mpz_t size;
+      HOST_WIDE_INT arraysize;
+
+      gfc_array_size (expr, &size);
+      arraysize = mpz_get_ui (size);
+      mpz_clear (size);
+
+      if (arraysize == 0)
+       return true;
+    }
+
   found_length = -1;
 
   if (expr->ts.u.cl->length == NULL)
index 44290ac2741c82ad187953075e7b426603c4f28b..18295978e420f910fa11f9ff351cbaa5f2efe82e 100644 (file)
@@ -627,7 +627,7 @@ simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *d
       n += 1;
     }
 
-  done = false;
+  done = resultsize <= 0;
   base = arrayvec;
   dest = resultvec;
   while (!done)
@@ -5304,7 +5304,7 @@ simplify_minmaxloc_to_array (gfc_expr *result, gfc_expr *array,
       n += 1;
     }
 
-  done = false;
+  done = resultsize <= 0;
   base = arrayvec;
   dest = resultvec;
   while (!done)
diff --git a/gcc/testsuite/gfortran.dg/zero_sized_10.f90 b/gcc/testsuite/gfortran.dg/zero_sized_10.f90
new file mode 100644 (file)
index 0000000..f152b3a
--- /dev/null
@@ -0,0 +1,10 @@
+! { dg-do compile }
+! { PR 85111 - this used to ICE. }
+! Original test case by Gernhard Steinmetz.
+program p
+   integer, parameter :: a(2,0) = reshape([1,2,3,4], shape(a))
+   character, parameter :: ac(2,0) = reshape(['a','b','c','d'], shape(ac))
+   integer, parameter :: b(2) = maxloc(a, dim=1) ! { dg-error "Different shape" }
+   integer, parameter :: c(2) = minloc(a, dim=1) ! { dg-error "Different shape" }
+   character, parameter :: d(2) = maxval(ac, dim=1) ! { dg-error "Different shape" }
+ end program p