re PR fortran/85111 (ICE in min_max_choose, at fortran/simplify.c:4884 (and others))
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
This commit is contained in:
parent
06be18e782
commit
1832cbf890
3 changed files with 26 additions and 2 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
10
gcc/testsuite/gfortran.dg/zero_sized_10.f90
Normal file
10
gcc/testsuite/gfortran.dg/zero_sized_10.f90
Normal file
|
@ -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
|
Loading…
Add table
Reference in a new issue