From ab94bb744a7d64751f6b93cc56ad3ed5fe5cfc81 Mon Sep 17 00:00:00 2001 From: Mark Eggleston Date: Mon, 17 Aug 2020 13:50:28 +0100 Subject: [PATCH] Fortran : Runtime error, reshape constant array assignment PR96624 When assigning a reshaped constant array of shape [2,0] to a variable fails with an invalid memory access. If a varibale with the parameter attribute is initialised with the same reshape there is no runtime error. 2020-08-20 Steven G. Kargl gcc/fortran/ PR fortran/96624 * simplify.c (gfc_simplifiy_reshape): Add new variable "zerosize". Set zerosize if any of the result shape ranks are zero. After setting the result shapes, if zerosize is set jump to new label "sizezero". Add label "sizezero" just before clearing index and returning result. 2020-08-20 Mark Eggleston gcc/testsuite/ PR fortran/96624 *gfortran/pr96624.f90: New test. --- gcc/fortran/simplify.c | 11 ++++++++++- gcc/testsuite/gfortran.dg/pr96624.f90 | 10 ++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr96624.f90 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index eb8b2afeb29..0d77d289651 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -6721,6 +6721,7 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp, unsigned long j; size_t nsource; gfc_expr *e, *result; + bool zerosize = false; /* Check that argument expression types are OK. */ if (!is_constant_array_expr (source) @@ -6843,7 +6844,14 @@ gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp, result->rank = rank; result->shape = gfc_get_shape (rank); for (i = 0; i < rank; i++) - mpz_init_set_ui (result->shape[i], shape[i]); + { + mpz_init_set_ui (result->shape[i], shape[i]); + if (shape[i] == 0) + zerosize = true; + } + + if (zerosize) + goto sizezero; while (nsource > 0 || npad > 0) { @@ -6893,6 +6901,7 @@ inc: break; } +sizezero: mpz_clear (index); return result; diff --git a/gcc/testsuite/gfortran.dg/pr96624.f90 b/gcc/testsuite/gfortran.dg/pr96624.f90 new file mode 100644 index 00000000000..a4cfe5c3279 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr96624.f90 @@ -0,0 +1,10 @@ +! { dg-do run } + +program test + integer :: a(2,0) + character(4) :: buffer + a = reshape([1,2,3,4], [2,0]) + write(buffer,"(2a1)") ">", "<" + if (trim(buffer).ne."><") stop 1 +end + -- 2.11.0