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, fortran] PR47844 - Array stride ignored for pointer-valued function results


Dear All,

As the testcase shows, pointer array functions can return strides that
are different to their initial values before the function call.  This
fix makes use of the descriptor strides since they are returned
durectly.

Bootstrapped and regtested of x86_64/FC9 - OK for trunk?

Cheers

Paul

2011-10-06  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/47844
	* trans-array.c (gfc_conv_array_index_offset): Use descriptor
	stride for pointer function results.

2011-10-06  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/47844
	* gfortran.dg/pointer_function_result_1.f90 : New test.
Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c	(revision 179472)
--- gcc/fortran/trans-array.c	(working copy)
*************** gfc_conv_array_index_offset (gfc_se * se
*** 2621,2626 ****
--- 2621,2638 ----
        /* Temporary array or derived type component.  */
        gcc_assert (se->loop);
        index = se->loop->loopvar[se->loop->order[i]];
+ 
+       /* Pointer functions can have stride[0] different from unity. 
+ 	 Use the stride returned by the function call and stored in
+ 	 the descriptor for the temporary.  */ 
+       if (se->ss && se->ss->type == GFC_SS_FUNCTION
+ 	    && se->ss->expr
+ 	    && se->ss->expr->symtree
+ 	    && se->ss->expr->symtree->n.sym->result
+ 	    && se->ss->expr->symtree->n.sym->result->attr.pointer)
+ 	stride = gfc_conv_descriptor_stride_get (info->descriptor,
+ 						 gfc_rank_cst[dim]);
+ 
        if (!integer_zerop (info->delta[dim]))
  	index = fold_build2_loc (input_location, PLUS_EXPR,
  				 gfc_array_index_type, index, info->delta[dim]);
Index: gcc/testsuite/gfortran.dg/pointer_function_result_1.f90
===================================================================
*** gcc/testsuite/gfortran.dg/pointer_function_result_1.f90	(revision 0)
--- gcc/testsuite/gfortran.dg/pointer_function_result_1.f90	(revision 0)
***************
*** 0 ****
--- 1,28 ----
+ ! (dg-do run }
+ ! Test the fix for PR47844, in which the stride in the function result
+ ! was ignored. Previously, the result was [1,3] at lines 15 and 16.
+ !
+ ! Contributed by KePu  <Kdx1999@gmail.com>
+ !
+ PROGRAM test_pointer_value
+   IMPLICIT NONE
+   INTEGER, DIMENSION(10), TARGET :: array= [1,3,5,7,9,11,13,15,17,19]
+   INTEGER, dimension(2) :: array_fifth
+   INTEGER, POINTER, DIMENSION(:) :: ptr_array => NULL()
+   INTEGER, POINTER, DIMENSION(:) :: ptr_array_fifth => NULL()
+   ptr_array => array
+   array_fifth = every_fifth (ptr_array)
+   if (any (array_fifth .ne. [1,11])) call abort
+   if (any (every_fifth(ptr_array) .ne. [1,11])) call abort
+ CONTAINS
+   FUNCTION every_fifth (ptr_array) RESULT (ptr_fifth)
+     IMPLICIT NONE
+     INTEGER, POINTER, DIMENSION(:) :: ptr_fifth
+     INTEGER, POINTER, DIMENSION(:), INTENT(in) :: ptr_array
+     INTEGER :: low
+     INTEGER :: high
+     low = LBOUND (ptr_array, 1)
+     high = UBOUND (ptr_array, 1)
+     ptr_fifth => ptr_array (low: high: 5) 
+   END FUNCTION every_fifth
+ END PROGRAM test_pointer_value

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