This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, libfortran] Fix PR 38234
- From: Thomas Koenig <tkoenig at netcologne dot de>
- To: fortran at gcc dot gnu dot org
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sun, 23 Nov 2008 15:42:02 +0100
- Subject: [patch, libfortran] Fix PR 38234
Hello world,
this fixes another regression in RESHAPE bounds checking, which showed
up with RUNTESTFLAGS="-target_board=unix/-fbounds-check", which
Dominique then analyzed.
Regression-tested both with and without the above flag (which I will
start doing on a regular basis when doing bounds checking patches).
OK for trunk?
Thomas
2008-11-23 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/38234
* intrinsics/reshape_generic.c (reshape_internal):
Source can be larger than shape.
* m4/reshape.m4: Likewise.
* generated/reshape_c10.c Regenerated.
* generated/reshape_c16.c Regenerated.
* generated/reshape_c4.c Regenerated.
* generated/reshape_c8.c Regenerated.
* generated/reshape_i16.c Regenerated.
* generated/reshape_i4.c Regenerated.
* generated/reshape_i8.c Regenerated.
* generated/reshape_r10.c Regenerated.
* generated/reshape_r16.c Regenerated.
* generated/reshape_r4.c Regenerated.
* generated/reshape_r8.c Regenerated.
2008-11-23 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/38234
* gfortran.dg/reshape_4.f90: New test.
Index: m4/reshape.m4
===================================================================
--- m4/reshape.m4 (revision 142125)
+++ m4/reshape.m4 (working copy)
@@ -123,6 +123,37 @@ reshape_'rtype_ccode` ('rtype` * const r
if (shape_empty)
return;
+ if (pad)
+ {
+ pdim = GFC_DESCRIPTOR_RANK (pad);
+ psize = 1;
+ pempty = 0;
+ for (n = 0; n < pdim; n++)
+ {
+ pcount[n] = 0;
+ pstride[n] = pad->dim[n].stride;
+ pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound;
+ if (pextent[n] <= 0)
+ {
+ pempty = 1;
+ pextent[n] = 0;
+ }
+
+ if (psize == pstride[n])
+ psize *= pextent[n];
+ else
+ psize = 0;
+ }
+ pptr = pad->data;
+ }
+ else
+ {
+ pdim = 0;
+ psize = 1;
+ pempty = 1;
+ pptr = NULL;
+ }
+
if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, source_extent;
@@ -148,7 +179,7 @@ reshape_'rtype_ccode` ('rtype` * const r
source_extent *= se > 0 ? se : 0;
}
- if (rs < source_extent || (rs > source_extent && !pad))
+ if (rs > source_extent && (!pad || pempty))
runtime_error("Incorrect size in SOURCE argument to RESHAPE"
" intrinsic: is %ld, should be %ld",
(long int) source_extent, (long int) rs);
@@ -223,37 +254,6 @@ reshape_'rtype_ccode` ('rtype` * const r
ssize = 0;
}
- if (pad)
- {
- pdim = GFC_DESCRIPTOR_RANK (pad);
- psize = 1;
- pempty = 0;
- for (n = 0; n < pdim; n++)
- {
- pcount[n] = 0;
- pstride[n] = pad->dim[n].stride;
- pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound;
- if (pextent[n] <= 0)
- {
- pempty = 1;
- pextent[n] = 0;
- }
-
- if (psize == pstride[n])
- psize *= pextent[n];
- else
- psize = 0;
- }
- pptr = pad->data;
- }
- else
- {
- pdim = 0;
- psize = 1;
- pempty = 1;
- pptr = NULL;
- }
-
if (rsize != 0 && ssize != 0 && psize != 0)
{
rsize *= sizeof ('rtype_name`);
Index: intrinsics/reshape_generic.c
===================================================================
--- intrinsics/reshape_generic.c (revision 142125)
+++ intrinsics/reshape_generic.c (working copy)
@@ -108,6 +108,37 @@ reshape_internal (parray *ret, parray *s
if (shape_empty)
return;
+ if (pad)
+ {
+ pdim = GFC_DESCRIPTOR_RANK (pad);
+ psize = 1;
+ pempty = 0;
+ for (n = 0; n < pdim; n++)
+ {
+ pcount[n] = 0;
+ pstride[n] = pad->dim[n].stride;
+ pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound;
+ if (pextent[n] <= 0)
+ {
+ pempty = 1;
+ pextent[n] = 0;
+ }
+
+ if (psize == pstride[n])
+ psize *= pextent[n];
+ else
+ psize = 0;
+ }
+ pptr = pad->data;
+ }
+ else
+ {
+ pdim = 0;
+ psize = 1;
+ pempty = 1;
+ pptr = NULL;
+ }
+
if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, source_extent;
@@ -133,7 +164,7 @@ reshape_internal (parray *ret, parray *s
source_extent *= se > 0 ? se : 0;
}
- if (rs < source_extent || (rs > source_extent && !pad))
+ if (rs > source_extent && (!pad || pempty))
runtime_error("Incorrect size in SOURCE argument to RESHAPE"
" intrinsic: is %ld, should be %ld",
(long int) source_extent, (long int) rs);
@@ -206,37 +237,6 @@ reshape_internal (parray *ret, parray *s
ssize = 0;
}
- if (pad)
- {
- pdim = GFC_DESCRIPTOR_RANK (pad);
- psize = 1;
- pempty = 0;
- for (n = 0; n < pdim; n++)
- {
- pcount[n] = 0;
- pstride[n] = pad->dim[n].stride;
- pextent[n] = pad->dim[n].ubound + 1 - pad->dim[n].lbound;
- if (pextent[n] <= 0)
- {
- pempty = 1;
- pextent[n] = 0;
- }
-
- if (psize == pstride[n])
- psize *= pextent[n];
- else
- psize = 0;
- }
- pptr = pad->data;
- }
- else
- {
- pdim = 0;
- psize = 1;
- pempty = 1;
- pptr = NULL;
- }
-
if (rsize != 0 && ssize != 0 && psize != 0)
{
rsize *= size;
! { dg-do run }
! { dg-options "-fbounds-check" }
program main
real, dimension(2,2) :: result
real, dimension(6) :: source
real, dimension(2) :: pad
call random_number (source)
call random_number (pad)
result = reshape(source, shape(result),pad=pad(1:0))
result = reshape(source, shape(result))
result = reshape(source, shape(result),pad=pad)
end program main