This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]