From patchwork Thu Oct 6 20:22:12 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Richard Thomas X-Patchwork-Id: 118161 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 7B647B7010 for ; Fri, 7 Oct 2011 07:22:36 +1100 (EST) Received: (qmail 17745 invoked by alias); 6 Oct 2011 20:22:30 -0000 Received: (qmail 17726 invoked by uid 22791); 6 Oct 2011 20:22:29 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Received: from mail-wy0-f175.google.com (HELO mail-wy0-f175.google.com) (74.125.82.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 06 Oct 2011 20:22:14 +0000 Received: by wyh5 with SMTP id 5so3613054wyh.20 for ; Thu, 06 Oct 2011 13:22:12 -0700 (PDT) MIME-Version: 1.0 Received: by 10.216.179.7 with SMTP id g7mr1375999wem.64.1317932532855; Thu, 06 Oct 2011 13:22:12 -0700 (PDT) Received: by 10.216.2.7 with HTTP; Thu, 6 Oct 2011 13:22:12 -0700 (PDT) Date: Thu, 6 Oct 2011 22:22:12 +0200 Message-ID: Subject: [Patch, fortran] PR47844 - Array stride ignored for pointer-valued function results From: Paul Richard Thomas To: fortran@gcc.gnu.org, gcc-patches Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 PR fortran/47844 * trans-array.c (gfc_conv_array_index_offset): Use descriptor stride for pointer function results. 2011-10-06 Paul Thomas 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 + ! + 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