[9/10,Regression,fortran] ICE in simplify_findloc_nodim, at fortran/simplify.c:5513

Message ID 28ac0912-40d0-69e7-6529-902d286dcbc9@codethink.co.uk
State New
Headers show
Series
  • Untitled series #23016
Related show

Commit Message

Mark Eggleston Feb. 24, 2020, 12:24 p.m.
Please find attached a patch to fix PR93835. This patch ensures that the 
array returned by SHAPE has its shape defined, the original patch from 
Steve Kargl handled the lack of shape for the returned array.

The bonus white space issues fixed in the original patch have been retained.

A side affect of the patch is a change in the errors expected by the 
test case pr77351.f90. Instead of "Error: Different shape for elemental 
binary operation at (1) on dimension 1 (1 and 2)" and "Error: Array 
operands are incommensurate at (1)" there is only "Error: Shapes for 
operands at (1) and (2) are not conformable" which is effectively the same.

gcc/fortran/ChangeLog

     Mark Eggleston <mark.eggleston@codethink.com>
     Steven G. Kargl <kargl@gcc.gnu.org>

     PR fortran/93835
     * decl.c (gfc_match_data) : Check whether the data expression
     is a derived type and is a constructor. If a BOZ constant
     is encountered in the constructor output an error and return
     MATCH_ERROR.

gcc/testsuite/ChangeLog

     Mark Eggleston <mark.eggleston@codethink.com>

     PR fortran/93835
     * gfortran.dg/pr77351.f90 : Check for one error instead of two.
     * gfortran.dg/pr93835.f08 : New test.

-- 
https://www.codethink.co.uk/privacy.html

-- 
https://www.codethink.co.uk/privacy.html

Comments

Mark Eggleston Feb. 24, 2020, 12:35 p.m. | #1
Forgot to add the purpose of the e-mail: OK to commit?

On 24/02/2020 12:24, Mark Eggleston wrote:
> Please find attached a patch to fix PR93835. This patch ensures that 

> the array returned by SHAPE has its shape defined, the original patch 

> from Steve Kargl handled the lack of shape for the returned array.

>

> The bonus white space issues fixed in the original patch have been 

> retained.

>

> A side affect of the patch is a change in the errors expected by the 

> test case pr77351.f90. Instead of "Error: Different shape for 

> elemental binary operation at (1) on dimension 1 (1 and 2)" and 

> "Error: Array operands are incommensurate at (1)" there is only 

> "Error: Shapes for operands at (1) and (2) are not conformable" which 

> is effectively the same.

>

> gcc/fortran/ChangeLog

>

>     Mark Eggleston <mark.eggleston@codethink.com>

>     Steven G. Kargl <kargl@gcc.gnu.org>

>

>     PR fortran/93835

>     * decl.c (gfc_match_data) : Check whether the data expression

>     is a derived type and is a constructor. If a BOZ constant

>     is encountered in the constructor output an error and return

>     MATCH_ERROR.

>

> gcc/testsuite/ChangeLog

>

>     Mark Eggleston <mark.eggleston@codethink.com>

>

>     PR fortran/93835

>     * gfortran.dg/pr77351.f90 : Check for one error instead of two.

>     * gfortran.dg/pr93835.f08 : New test.

>

-- 
https://www.codethink.co.uk/privacy.html
Thomas Koenig Feb. 24, 2020, 1:20 p.m. | #2
Hi Mark,

OK for both trunk and gcc-9.

Thanks for taking this up, and thanks to Steve for debugging
this in the first place!

Regards

	Thomas

Patch

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

diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 613fdafd1a6..eb9d2f2c759 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -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;
 }
 
diff --git a/gcc/testsuite/gfortran.dg/pr77351.f90 b/gcc/testsuite/gfortran.dg/pr77351.f90
index 76ce5c528b2..e3e8bc4f64b 100644
--- a/gcc/testsuite/gfortran.dg/pr77351.f90
+++ b/gcc/testsuite/gfortran.dg/pr77351.f90
@@ -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" }
+
diff --git a/gcc/testsuite/gfortran.dg/pr93835.f08 b/gcc/testsuite/gfortran.dg/pr93835.f08
new file mode 100644
index 00000000000..933e249e632
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr93835.f08
@@ -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