With HLFIR the lbounds for the ALLOCATABLE result are taken
from the mutable box created for the result, so the non-default
lbounds might be propagated further causing incorrect result, e.g.:
program p real, allocatable :: p5(:) allocate(p5, source=real_init()) print *, lbound(p5, 1) ! must print 1, but prints 7 contains function real_init() real, allocatable :: real_init(:) allocate(real_init(7:8)) end function real_init end program p
With FIR lowering the box passed for source has explicit lower
bound 1 at the call site, but the runtime box initialized by
real_init call still has lower bound 7. I am not sure if
the runtime box initialized b real_init will ever be accessed
in a debugger via Fortran variable names, but I think that
having the right runtime bounds that can be accessible via
examining registers/stack might be good in general. So I decided
to update the runtime bounds at the point of return.
This change "fixes" the test above for HLFIR, but we may still
have a problem at the call site. I am not sure, though, where
the right fix should be.