https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119986
--- Comment #6 from anlauf at gcc dot gnu.org ---
Workaround: add
contiguous :: u, v
to force generation of a proper temporary.
The dump-tree looks really fishy for the subroutine:
{
integer(kind=8) D.4689;
struct array01_real(kind=4) parm.9;
integer(kind=8) D.4696;
D.4689 = ubound.0;
parm.9.span = 4;
parm.9.dtype = {.elem_len=4, .version=0, .rank=1, .type=3};
D.4696 = stride.1;
parm.9.dim[0].lbound = 1;
parm.9.dim[0].ubound = D.4689;
parm.9.dim[0].stride = NON_LVALUE_EXPR <D.4696>;
parm.9.data = (void *) u.0;
parm.9.offset = -NON_LVALUE_EXPR <D.4696>;
_gfortran_transfer_array_write (&dt_parm.8, &parm.9, 4, 0);
}
Without generating a temporary, this cannot work, as the main has:
...
parm.12.span = 8;
parm.12.dtype = {.elem_len=8, .version=0, .rank=1, .type=4};
parm.12.dim[0].lbound = 1;
parm.12.dim[0].ubound = 4;
parm.12.dim[0].stride = 1;
parm.12.data = (void *) &x.phi[0];
parm.12.offset = -1;
...
so all of span, elem_len, and data disagree with expectations.