public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
From: Mark Eggleston <mark.eggleston@codethink.co.uk>
To: gcc-patches <gcc-patches@gcc.gnu.org>, fortran <fortran@gcc.gnu.org>
Subject: [PATCH] Fortran : Runtime error, reshape constant array assignment, PR96624
Date: Thu, 20 Aug 2020 08:05:08 +0100	[thread overview]
Message-ID: <7d52fb1c-32b6-ae74-b8b2-281149c52971@codethink.co.uk> (raw)

[-- Attachment #1: Type: text/plain, Size: 1092 bytes --]

Please find attached a fix for PR96624.  The original patch was by Steve 
Kargl.

Also occurs on releases/gcc-10, releases/gcc-9 and releases/gcc-8 branches.

OK to commit to master and backport?

[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  <kargl@gcc.gnu.org>

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 <markeggleston@gcc.gnu.org>

gcc/testsuite/

     PR fortran/96624
     *gfortran/pr96624.f90: New test.

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


[-- Attachment #2: 0001-Fortran-Runtime-error-reshape-constant-array-assignm.patch --]
[-- Type: text/x-patch, Size: 2551 bytes --]

From ab94bb744a7d64751f6b93cc56ad3ed5fe5cfc81 Mon Sep 17 00:00:00 2001
From: Mark Eggleston <markeggleston@gcc.gnu.org>
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  <kargl@gcc.gnu.org>

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  <markeggleston@gcc.gnu.org>

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


                 reply	other threads:[~2020-08-20  7:05 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7d52fb1c-32b6-ae74-b8b2-281149c52971@codethink.co.uk \
    --to=mark.eggleston@codethink.co.uk \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).