PR fortran/99840 - [8/9/10/11 Regression] ICE in gfc_simplify_matmul, at fortran/simplify.c:4777

Message ID trinity-359a6837-d01d-45cb-9ae7-448516cf26c6-1617224939660@3c-app-gmx-bap04
State New
Headers show
Series
  • PR fortran/99840 - [8/9/10/11 Regression] ICE in gfc_simplify_matmul, at fortran/simplify.c:4777
Related show

Commit Message

Richard Biener via Gcc-patches March 31, 2021, 9:08 p.m.
Dear all,

the simplification of the TRANSPOSE of a zero-sized array would lead to
an ICE if the result was used in a subsequent simplification of a MATMUL.
The reason was the lack of the proper initialization of the shape, which
is mpz_t.  Use mpz_init_set instead of mpz_set.

Regtested on x86_64-pc-linux-gnu.  OK for mainline?

Since this is a regression, backport to all affected branches?

Thanks,
Harald


PR fortran/99840 - ICE in gfc_simplify_matmul, at fortran/simplify.c:4777

The simplification of the transposition of a constant array shall properly
initialize and set the shape of the result.

gcc/fortran/ChangeLog:

	PR fortran/99840
	* simplify.c (gfc_simplify_transpose): Properly initialize
	resulting shape.

gcc/testsuite/ChangeLog:

	PR fortran/99840
	* gfortran.dg/transpose_5.f90: New test.

Comments

Jerry DeLisle April 1, 2021, 12:28 a.m. | #1
Yes OK for trunk and affected branches.

Thanks,

Jerry

On 3/31/21 2:08 PM, Harald Anlauf via Fortran wrote:
> Dear all,

>

> the simplification of the TRANSPOSE of a zero-sized array would lead to

> an ICE if the result was used in a subsequent simplification of a MATMUL.

> The reason was the lack of the proper initialization of the shape, which

> is mpz_t.  Use mpz_init_set instead of mpz_set.

>

> Regtested on x86_64-pc-linux-gnu.  OK for mainline?

>

> Since this is a regression, backport to all affected branches?

>

> Thanks,

> Harald

>

>

> PR fortran/99840 - ICE in gfc_simplify_matmul, at fortran/simplify.c:4777

>

> The simplification of the transposition of a constant array shall properly

> initialize and set the shape of the result.

>

> gcc/fortran/ChangeLog:

>

> 	PR fortran/99840

> 	* simplify.c (gfc_simplify_transpose): Properly initialize

> 	resulting shape.

>

> gcc/testsuite/ChangeLog:

>

> 	PR fortran/99840

> 	* gfortran.dg/transpose_5.f90: New test.

>

Patch

diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 388aca7c38c..c27b47aa98f 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -8123,8 +8123,8 @@  gfc_simplify_transpose (gfc_expr *matrix)
 			       &matrix->where);
   result->rank = 2;
   result->shape = gfc_get_shape (result->rank);
-  mpz_set (result->shape[0], matrix->shape[1]);
-  mpz_set (result->shape[1], matrix->shape[0]);
+  mpz_init_set (result->shape[0], matrix->shape[1]);
+  mpz_init_set (result->shape[1], matrix->shape[0]);

   if (matrix->ts.type == BT_CHARACTER)
     result->ts.u.cl = matrix->ts.u.cl;
diff --git a/gcc/testsuite/gfortran.dg/transpose_5.f90 b/gcc/testsuite/gfortran.dg/transpose_5.f90
new file mode 100644
index 00000000000..682b1c8552b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/transpose_5.f90
@@ -0,0 +1,8 @@ 
+! { dg-do compiler }
+! { dg-options "-O2" }
+! PR fortran/99840 - ICE in gfc_simplify_matmul, at fortran/simplify.c:4777
+program p
+  integer, parameter :: x(0,0) = 0
+  integer :: y(0,0)
+  y = matmul (x, transpose(x))
+end