From b4a3defca6a9a7fa0c8b407a4d2f906dc074079d Mon Sep 17 00:00:00 2001
From: Mark Eggleston <markeggleston@gcc.gnu.org>
Date: Thu, 20 Feb 2020 13:25:39 +0000
Subject: [PATCH] fortran: ICE using SHAPE with FINDLOC PR93835
The expression reprenting the array returned by SHAPE does not
have its shape defined. An ICE occurs when FINDLOC attempts to
use the shape of the array.
Whitespace issues identified by Steven G. Kargl <kargl@gcc.gnu.org>
have also been fixed.
gcc/fortran/ChangeLog
PR fortran/93835
* simplify.c (simplify_findloc_nodim) : Fix whitespace issues.
(gfc_simplify_shape) : Create and initialise one shape value
for the result expression. Set shape value with the rank of
the source array.
gcc/testsuite/ChangeLog
PR fortran/93835
* gfortran.dg/pr77351.f90 : Check for one error instead of two.
* gfortran.dg/pr93835.f08 : New test.
---
gcc/fortran/simplify.c | 12 ++++++++----
gcc/testsuite/gfortran.dg/pr77351.f90 | 6 ++++--
gcc/testsuite/gfortran.dg/pr93835.f08 | 8 ++++++++
3 files changed, 20 insertions(+), 6 deletions(-)
create mode 100644 gcc/testsuite/gfortran.dg/pr93835.f08
@@ -5497,7 +5497,7 @@ simplify_findloc_nodim (gfc_expr *result, gfc_expr *value, gfc_expr *array,
bool continue_loop;
bool ma;
- for (i = 0; i<array->rank; i++)
+ for (i = 0; i < array->rank; i++)
res[i] = -1;
/* Shortcut for constant .FALSE. MASK. */
@@ -5540,7 +5540,7 @@ simplify_findloc_nodim (gfc_expr *result, gfc_expr *value, gfc_expr *array,
if (ma && gfc_compare_expr (a, value, INTRINSIC_EQ) == 0)
{
- for (i = 0; i<array->rank; i++)
+ for (i = 0; i < array->rank; i++)
res[i] = count[i];
if (!back_val)
goto finish;
@@ -5565,9 +5565,9 @@ simplify_findloc_nodim (gfc_expr *result, gfc_expr *value, gfc_expr *array,
} while (count[n] == extent[n]);
}
- finish:
+finish:
result_ctor = gfc_constructor_first (result->value.constructor);
- for (i = 0; i<array->rank; i++)
+ for (i = 0; i < array->rank; i++)
{
gfc_expr *r_expr;
r_expr = result_ctor->expr;
@@ -7228,6 +7228,8 @@ gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
return NULL;
result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
+ result->shape = gfc_get_shape (1);
+ mpz_init (result->shape[0]);
if (source->rank == 0)
return result;
@@ -7284,6 +7286,8 @@ gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
if (t)
gfc_clear_shape (shape, source->rank);
+ mpz_set_si (result->shape[0], source->rank);
+
return result;
}
@@ -1,6 +1,8 @@
! { dg-do compile }
+!
+! PR93835 resulted in different but valid error message
program p
integer :: z(4) = [1, 2, 3, 4]
- print *, any(shape(z) /= [4,1]) ! { dg-error "shape for elemental binary" }
+ print *, any(shape(z) /= [4,1]) ! { dg-error "Shapes for operands at .1. and .2. are not conformable" }
end
-! { dg-excess-errors "operands are incommensurate" }
+
new file mode 100644
@@ -0,0 +1,8 @@
+! {dg-do run }
+!
+! PR fortran/93835 - the following code resulted in an ICE
+!
+program p
+ if (any(findloc(shape(1), 1) .ne. 0)) stop 1
+end
+
--
2.11.0