Hi Harald, hi Chung-Lin,
On 29.11.21 21:21, Harald Anlauf wrote:
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.
Hmm, usually NAG is right ...
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.
The problem is that the standard does not really state what the bounds
are :-(
Usually, it ends up referring to LBOUND (with wordings like "each lower
bound equal to the corresponding element of LBOUND (expr)") – albeit not
in this case.
Assuming that holds, the question is what's lbound(h(3))? gfortran gives
[1] for that one. What does NAG yield?
For lbound(h(3),dim=1), the standard has:
"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."
Thus, the question is whether "h(3)" is a 'whole array' or not. That reads:
"A whole array is a named array or a structure component whose final
part-ref is an array component name; no subscript list is appended."
I think in "h(3)" there is not really a named array – thus I read it as
if the "Otherwise ... result value is 1" applies.
Tobias
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht
München, HRB 106955