Patchwork [fortran] PR47844 - Array stride ignored for pointer-valued function results

login
register
mail settings
Submitter Paul Richard Thomas
Date Oct. 6, 2011, 8:22 p.m.
Message ID <CAGkQGiLFCZd8W78TZ6Ut3frv_pLGCXj-a-D0ZcxBG2zKg_fj=g@mail.gmail.com>
Download mbox | patch
Permalink /patch/118161/
State New
Headers show

Comments

Paul Richard Thomas - Oct. 6, 2011, 8:22 p.m.
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.
Steve Kargl - Oct. 6, 2011, 11:29 p.m.
On Thu, Oct 06, 2011 at 10:22:12PM +0200, Paul Richard Thomas wrote:
> 
> 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.

OK.
Paul Richard Thomas - Oct. 7, 2011, 7:23 a.m.
Dear Steve,

Thanks - I just noticed that the { dg-do run } is missing a space.  It
seemed to run correctly during regtesting but I will set it right
anyway.

Cheers

Paul

On Fri, Oct 7, 2011 at 1:29 AM, Steve Kargl
<sgk@troutmask.apl.washington.edu> wrote:
> On Thu, Oct 06, 2011 at 10:22:12PM +0200, Paul Richard Thomas wrote:
>>
>> 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.
>
> OK.
>
> --
> Steve
>

Patch

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