Hello world, the attached patch fixes PR 85111, a regression introduced with my recent simplification patches. Seems like the zero-size saga has yet another chapter :-)
Regression-tested. OK for trunk? Regards Thomas 2017-03-29 Thomas Koenig <tkoe...@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-29 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/85111 * gfortran.dg/zero_sized_10.f90: New test.
Index: array.c =================================================================== --- array.c (revision 258845) +++ array.c (working copy) @@ -2003,6 +2003,20 @@ gfc_resolve_character_array_constructor (gfc_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: simplify.c =================================================================== --- simplify.c (revision 258845) +++ simplify.c (working copy) @@ -627,7 +627,7 @@ simplify_transformation_to_array (gfc_expr *result 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 n += 1; } - done = false; + done = resultsize <= 0; base = arrayvec; dest = resultvec; while (!done)
! { 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