re PR libfortran/34670 (bounds checking for array intrinsics)

2008-10-21  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR libfortran/34670
	* intrinsics/transpose_generic.c:  Implement bounds checking.
	* m4/transpose.m4:  Likewise.
	* generated/transpose_c8.c: Regenerated.
	* generated/transpose_c16.c: Regenerated.
	* generated/transpose_r10.c: Regenerated.
	* generated/transpose_i8.c: Regenerated.
	* generated/transpose_c10.c: Regenerated.
	* generated/transpose_r4.c: Regenerated.
	* generated/transpose_c4.c: Regenerated.
	* generated/transpose_i16.c: Regenerated.
	* generated/transpose_i4.c: Regenerated.
	* generated/transpose_r8.c: Regenerated.
	* generated/transpose_r16.c: Regenerated.

2008-10-21  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR libfortran/34670
	* gfortran.dg/transpose_2.f90:  New test.

From-SVN: r141276
This commit is contained in:
Thomas Koenig 2008-10-21 20:12:52 +00:00
parent 7d40743390
commit c0c7206d89
16 changed files with 327 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2008-10-21 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/34670
* gfortran.dg/transpose_2.f90: New test.
2008-10-21 Jakub Jelinek <jakub@redhat.com> 2008-10-21 Jakub Jelinek <jakub@redhat.com>
PR middle-end/37669 PR middle-end/37669

View File

@ -0,0 +1,18 @@
! { dg-do run }
! { dg-options "-fbounds-check" }
! { dg-shouldfail "Incorrect extent in return value of TRANSPOSE intrinsic in dimension 1: is 2, should be 3" }
program main
implicit none
character(len=10) :: in
real, dimension(:,:), allocatable :: a,b
integer :: ax, ay, bx, by
in = "2 2 3 2"
read (unit=in,fmt='(4I2)') ax, ay, bx, by
allocate (a(ax,ay))
allocate (b(bx,by))
a = 1.0
b = 2.1
b = transpose(a)
end program main
! { dg-output "Fortran runtime error: Incorrect extent in return value of TRANSPOSE intrinsic in dimension 1: is 2, should be 3" }

View File

@ -1,3 +1,20 @@
2008-10-21 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/34670
* intrinsics/transpose_generic.c: Implement bounds checking.
* m4/transpose.m4: Likewise.
* generated/transpose_c8.c: Regenerated.
* generated/transpose_c16.c: Regenerated.
* generated/transpose_r10.c: Regenerated.
* generated/transpose_i8.c: Regenerated.
* generated/transpose_c10.c: Regenerated.
* generated/transpose_r4.c: Regenerated.
* generated/transpose_c4.c: Regenerated.
* generated/transpose_i16.c: Regenerated.
* generated/transpose_i4.c: Regenerated.
* generated/transpose_r8.c: Regenerated.
* generated/transpose_r16.c: Regenerated.
2008-10-19 Jerry DeLisle <jvdelisle@gcc.gnu.org 2008-10-19 Jerry DeLisle <jvdelisle@gcc.gnu.org
PR libfortran/37834 PR libfortran/37834

View File

@ -69,6 +69,28 @@ transpose_c10 (gfc_array_c10 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_10) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_10) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_c16 (gfc_array_c16 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_16) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_16) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_c4 (gfc_array_c4 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_4) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_4) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_c8 (gfc_array_c8 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_8) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_8) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_i16 (gfc_array_i16 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_INTEGER_16) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_INTEGER_16) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_i4 (gfc_array_i4 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_INTEGER_4) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_INTEGER_4) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_i8 (gfc_array_i8 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_INTEGER_8) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_INTEGER_8) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_r10 (gfc_array_r10 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_REAL_10) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_REAL_10) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_r16 (gfc_array_r16 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_REAL_16) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_REAL_16) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_r4 (gfc_array_r4 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_REAL_4) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_REAL_4) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -69,6 +69,28 @@ transpose_r8 (gfc_array_r8 * const restrict ret,
ret->data = internal_malloc_size (sizeof (GFC_REAL_8) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof (GFC_REAL_8) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;

View File

@ -68,6 +68,29 @@ transpose_internal (gfc_array_char *ret, gfc_array_char *source,
ret->data = internal_malloc_size (size * size0 ((array_t*)ret)); ret->data = internal_malloc_size (size * size0 ((array_t*)ret));
ret->offset = 0; ret->offset = 0;
} }
else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
}
sxstride = source->dim[0].stride * size; sxstride = source->dim[0].stride * size;
systride = source->dim[1].stride * size; systride = source->dim[1].stride * size;

View File

@ -70,6 +70,28 @@ transpose_'rtype_code` ('rtype` * const restrict ret,
ret->data = internal_malloc_size (sizeof ('rtype_name`) * size0 ((array_t *) ret)); ret->data = internal_malloc_size (sizeof ('rtype_name`) * size0 ((array_t *) ret));
ret->offset = 0; ret->offset = 0;
} else if (unlikely (compile_options.bounds_check))
{
index_type ret_extent, src_extent;
ret_extent = ret->dim[0].ubound + 1 - ret->dim[0].lbound;
src_extent = source->dim[1].ubound + 1 - source->dim[1].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 1: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
ret_extent = ret->dim[1].ubound + 1 - ret->dim[1].lbound;
src_extent = source->dim[0].ubound + 1 - source->dim[0].lbound;
if (src_extent != ret_extent)
runtime_error ("Incorrect extent in return value of TRANSPOSE"
" intrinsic in dimension 2: is %ld,"
" should be %ld", (long int) src_extent,
(long int) ret_extent);
} }
sxstride = source->dim[0].stride; sxstride = source->dim[0].stride;