Hi Chung-Lin,

Am 29.11.21 um 15:25 schrieb Chung-Lin Tang:
This patch by Tobias, fixes a case of setting array low-bounds, found
for particular uses of SOURCE=/MOLD=.

For example:
program A_M
   implicit none
   real, dimension (:), allocatable :: A, B
   allocate (A(0:5))
   call Init (A)
contains
   subroutine Init ( A )
     real, dimension ( 0 : ), intent ( in ) :: A
     integer, dimension ( 1 ) :: lb_B

     allocate (B, mold = A)
     ...
     lb_B = lbound (B, dim=1)   ! Error: lb_B assigned 1, instead of 0
like lower-bound of A.

Referencing the Fortran standard:

"16.9.109 LBOUND (ARRAY [, DIM, KIND])"
states:
"If DIM is present, ARRAY is a whole array, and either ARRAY is
  an assumed-size array of rank DIM or dimension DIM of ARRAY has
  nonzero extent, the result has a value equal to the lower bound
  for subscript DIM of ARRAY. Otherwise, if DIM is present, the
  result value is 1."

And on what is a "whole array":

"9.5.2 Whole arrays"
"A whole array is a named array or a structure component ..."

The attached patch adjusts the relevant part in gfc_trans_allocate() to
only set
e3_has_nodescriptor only for non-named arrays.

Tobias has tested this once, and I've tested this patch as well on our
complete set of
testsuites (which usually serves for OpenMP related stuff). Everything
appears well with no regressions.

Is this okay for trunk?

I think you need to check the following:

 allocate(c, source=h(3))
 write(*,*) lbound(c,1), ubound(c,1) ! prints 1 3

...

 pure function h(i) result(r)
  integer, value, intent(in) :: i
  integer, allocatable :: r(:)
  allocate(r(3:5))
  r = [1,2,3]
 end function h

This used to print 3 5, which is also what e.g. NAG, Nvidia, flang do.
Intel prints 1 3, so it agrees with you.

The Fortran standard has:

9.7.1.2  Execution of an ALLOCATE statement

(6) When an ALLOCATE statement is executed for an array with no
    allocate-shape-spec-list, the bounds of source-expr determine the
    bounds of the array. Subsequent changes to the bounds of source-expr
    do not affect the array bounds.

Please re-check with Tobias.

Thanks,
Harald

Thanks,
Chung-Lin

2021-11-29  Tobias Burnus  <tob...@codesourcery.com>

gcc/fortran/ChangeLog:

     * trans-stmt.c (gfc_trans_allocate): Set e3_has_nodescriptor to true
     only for non-named arrays.

gcc/testsuite/ChangeLog:

     * gfortran.dg/allocate_with_source_26.f90: Adjust testcase.
     * gfortran.dg/allocate_with_mold_4.f90: New testcase.

Reply via email to