public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fortran: runtime bounds-checking in presence of array constructors [PR31059]
@ 2023-08-31 20:42 Harald Anlauf
  2023-09-01  8:41 ` Mikael Morin
  0 siblings, 1 reply; 4+ messages in thread
From: Harald Anlauf @ 2023-08-31 20:42 UTC (permalink / raw)
  To: fortran, gcc-patches

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

Dear all,

gfortran's array bounds-checking code does a mostly reasonable
job for array sections in expressions and assignments, but
forgot the case that (rank-1) expressions can involve array
constructors, which have a shape ;-)

The attached patch walks over the loops generated by the
scalarizer, checks for the presence of a constructor, and
takes the first shape found as reference.  (If several
constructors are present, discrepancies in their shape
seems to be already detected at compile time).

For more details on what will be caught now see testcase.

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

Thanks,
Harald


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: pr31059.diff --]
[-- Type: text/x-patch, Size: 3311 bytes --]

From 944a35909e8eeb79c92e398ae3f27e94708584e6 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Thu, 31 Aug 2023 22:19:58 +0200
Subject: [PATCH] Fortran: runtime bounds-checking in presence of array
 constructors [PR31059]

gcc/fortran/ChangeLog:

	PR fortran/31059
	* trans-array.cc (gfc_conv_ss_startstride): For array bounds checking,
	consider also array constructors in expressions, and use their shape.

gcc/testsuite/ChangeLog:

	PR fortran/31059
	* gfortran.dg/bounds_check_fail_5.f90: New test.
---
 gcc/fortran/trans-array.cc                    | 23 ++++++++++++++++
 .../gfortran.dg/bounds_check_fail_5.f90       | 26 +++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 gcc/testsuite/gfortran.dg/bounds_check_fail_5.f90

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 90a7d4e9aef..6ca58e98547 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -4740,6 +4740,29 @@ done:
       for (n = 0; n < loop->dimen; n++)
 	size[n] = NULL_TREE;

+      /* If there is a constructor involved, derive size[] from its shape.  */
+      for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain)
+	{
+	  gfc_ss_info *ss_info;
+
+	  ss_info = ss->info;
+	  info = &ss_info->data.array;
+
+	  if (ss_info->type == GFC_SS_CONSTRUCTOR && info->shape)
+	    {
+	      for (n = 0; n < loop->dimen; n++)
+		{
+		  if (size[n] == NULL)
+		    {
+		      gcc_assert (info->shape[n]);
+		      size[n] = gfc_conv_mpz_to_tree (info->shape[n],
+						      gfc_index_integer_kind);
+		    }
+		}
+	      break;
+	    }
+	}
+
       for (ss = loop->ss; ss != gfc_ss_terminator; ss = ss->loop_chain)
 	{
 	  stmtblock_t inner;
diff --git a/gcc/testsuite/gfortran.dg/bounds_check_fail_5.f90 b/gcc/testsuite/gfortran.dg/bounds_check_fail_5.f90
new file mode 100644
index 00000000000..436cc96621d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/bounds_check_fail_5.f90
@@ -0,0 +1,26 @@
+! { dg-do run }
+! { dg-additional-options "-fcheck=bounds -g -fdump-tree-original" }
+! { dg-output "At line 13 .*" }
+! { dg-shouldfail "Array bound mismatch for dimension 1 of array 'ivec' (2/3)" }
+!
+! PR fortran/31059 - runtime bounds-checking in presence of array constructors
+
+program p
+  integer              :: jvec(3) = [1,2,3]
+  integer, allocatable :: ivec(:), kvec(:), lvec(:), mvec(:), nvec(:)
+  ivec    = [1,2]   ! (re)allocation
+  kvec    = [4,5,6] ! (re)allocation
+  ivec(:) = [4,5,6] ! runtime error (->dump)
+  ! not reached ...
+  print *, jvec + [1,2,3] ! OK & no check generated
+  print *, [4,5,6] + jvec ! OK & no check generated
+  print *, lvec + [1,2,3] ! check generated (->dump)
+  print *, [4,5,6] + mvec ! check generated (->dump)
+  nvec(:) = jvec          ! check generated (->dump)
+end
+
+! { dg-final { scan-tree-dump-times "Array bound mismatch " 4 "original" } }
+! { dg-final { scan-tree-dump-times "Array bound mismatch .*ivec" 1 "original" } }
+! { dg-final { scan-tree-dump-times "Array bound mismatch .*lvec" 1 "original" } }
+! { dg-final { scan-tree-dump-times "Array bound mismatch .*mvec" 1 "original" } }
+! { dg-final { scan-tree-dump-times "Array bound mismatch .*nvec" 1 "original" } }
--
2.35.3


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Fortran: runtime bounds-checking in presence of array constructors [PR31059]
  2023-08-31 20:42 [PATCH] Fortran: runtime bounds-checking in presence of array constructors [PR31059] Harald Anlauf
@ 2023-09-01  8:41 ` Mikael Morin
  2023-09-01 20:48   ` Harald Anlauf
  0 siblings, 1 reply; 4+ messages in thread
From: Mikael Morin @ 2023-09-01  8:41 UTC (permalink / raw)
  To: Harald Anlauf, fortran, gcc-patches

Le 31/08/2023 à 22:42, Harald Anlauf via Fortran a écrit :
> Dear all,
> 
> gfortran's array bounds-checking code does a mostly reasonable
> job for array sections in expressions and assignments, but
> forgot the case that (rank-1) expressions can involve array
> constructors, which have a shape ;-)
> 
> The attached patch walks over the loops generated by the
> scalarizer, checks for the presence of a constructor, and
> takes the first shape found as reference.  (If several
> constructors are present, discrepancies in their shape
> seems to be already detected at compile time).
> 
> For more details on what will be caught now see testcase.
> 
> Regtested on x86_64-pc-linux-gnu.  OK for mainline?
> 
This is OK.

May I suggest to handle functions the same way?

Thanks.

> Thanks,
> Harald
> 


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Fortran: runtime bounds-checking in presence of array constructors [PR31059]
  2023-09-01  8:41 ` Mikael Morin
@ 2023-09-01 20:48   ` Harald Anlauf
  2023-09-08  9:33     ` Mikael Morin
  0 siblings, 1 reply; 4+ messages in thread
From: Harald Anlauf @ 2023-09-01 20:48 UTC (permalink / raw)
  To: Mikael Morin, fortran, gcc-patches

Hi Mikael,

On 9/1/23 10:41, Mikael Morin via Gcc-patches wrote:
> Le 31/08/2023 à 22:42, Harald Anlauf via Fortran a écrit :
>> Dear all,
>>
>> gfortran's array bounds-checking code does a mostly reasonable
>> job for array sections in expressions and assignments, but
>> forgot the case that (rank-1) expressions can involve array
>> constructors, which have a shape ;-)
>>
>> The attached patch walks over the loops generated by the
>> scalarizer, checks for the presence of a constructor, and
>> takes the first shape found as reference.  (If several
>> constructors are present, discrepancies in their shape
>> seems to be already detected at compile time).
>>
>> For more details on what will be caught now see testcase.
>>
>> Regtested on x86_64-pc-linux-gnu.  OK for mainline?
>>
> This is OK.

I've pushed this is the first step.

> May I suggest to handle functions the same way?

I'll have a look at them, but will need to gather a few
suitable testcases first.

Thanks for the review!

Harald

>
> Thanks.
>
>> Thanks,
>> Harald
>>
>
>


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Fortran: runtime bounds-checking in presence of array constructors [PR31059]
  2023-09-01 20:48   ` Harald Anlauf
@ 2023-09-08  9:33     ` Mikael Morin
  0 siblings, 0 replies; 4+ messages in thread
From: Mikael Morin @ 2023-09-08  9:33 UTC (permalink / raw)
  To: Harald Anlauf, fortran, gcc-patches

Le 01/09/2023 à 22:48, Harald Anlauf a écrit :
> Hi Mikael,
> 
> On 9/1/23 10:41, Mikael Morin via Gcc-patches wrote:
>> May I suggest to handle functions the same way?
> 
> I'll have a look at them, but will need to gather a few
> suitable testcases first.
> 
I have just opened PR111339 
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111339) to track the case 
of functions separately.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-09-08  9:33 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-31 20:42 [PATCH] Fortran: runtime bounds-checking in presence of array constructors [PR31059] Harald Anlauf
2023-09-01  8:41 ` Mikael Morin
2023-09-01 20:48   ` Harald Anlauf
2023-09-08  9:33     ` Mikael Morin

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).