This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran 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, fortran] Fix PR 46007, segfault with shape


Hello world,

this rather straightforward patch fixes PR 46007.

Regression-tested on trunk.  OK for trunk?  Also OK for 4.5 after
regression-testing there?

	Thomas

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

	PR fortran/46007
	* m4/shape.m4 (shape_'rtype_kind`):  Use variable for rank.
	Allocate return array if unallocated.
	* generated/shape_i4.c:  Regenerated.
	* generated/shape_i8.c:  Regenerated.
	* generated/shape_i16.c:  Regenerated.

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

	PR fortran/46007
	* gfortran.dg/shape_5.f90:  New test case.

! { dg-do run }
! PR 40067 - this used to segfault on an unallocated return array.
    integer, dimension(10)             :: int1d
    integer, dimension(:), pointer     :: int1d_retrieved

    allocate(int1d_retrieved(10))
    if (any(shape(int1d_retrieved) /= shape(INT1D))) call abort()
    end
Index: m4/shape.m4
===================================================================
--- m4/shape.m4	(Revision 165561)
+++ m4/shape.m4	(Arbeitskopie)
@@ -42,13 +42,23 @@ shape_'rtype_kind` ('rtype` * const restrict ret,
   int n;
   index_type stride;
   index_type extent;
+  int rank;
 
+  rank = GFC_DESCRIPTOR_RANK (array);
+
+  if (ret->data == NULL)
+    {
+      GFC_DIMENSION_SET(ret->dim[0], 0, rank - 1, 1);
+      ret->offset = 0;
+      ret->data = internal_malloc_size (sizeof ('rtype_name`) * rank);
+    }
+
   stride = GFC_DESCRIPTOR_STRIDE(ret,0);
 
   if (GFC_DESCRIPTOR_EXTENT(ret,0) < 1)
     return;
 
-  for (n = 0; n < GFC_DESCRIPTOR_RANK (array); n++)
+  for (n = 0; n < rank; n++)
     {
       extent = GFC_DESCRIPTOR_EXTENT(array,n);
       ret->data[n * stride] = extent > 0 ? extent : 0 ;

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