diff mbox

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

Message ID CAGkQGiLFCZd8W78TZ6Ut3frv_pLGCXj-a-D0ZcxBG2zKg_fj=g@mail.gmail.com
State New
Headers show

Commit Message

Paul Richard Thomas Oct. 6, 2011, 8:22 p.m. UTC
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.

Comments

Steve Kargl Oct. 6, 2011, 11:29 p.m. UTC | #1
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. UTC | #2
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
>
diff mbox

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