https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117791
--- Comment #5 from anlauf at gcc dot gnu.org ---
Further data points:
- introducing a temporary array for the result, e.g.
integer :: aux_array(4)
and using it as
aux_array = array(:, sort_2(i(1:2)) )
write(*,*) 'line 5:',aux_array
generates correct code, and the bounds-checking code is sane.
- the original code line
write(*,*) 'line 4:',array(:, sort_2(i(1:2)) )
generates 2 (!) calls to sort_2, with the version used in the bounds-checking
not having the descriptor of the argument array set up:
struct array01_integer(kind=4) parm.2;
integer(kind=8) D.4814;
struct array01_integer(kind=4) parm.3;
integer(kind=8) D.4821;
struct array01_integer(kind=4) parm.4;
D.4814 = (integer(kind=8)) sort_2 ((integer(kind=4)[0:] *)
parm.2.data);
if (D.4814 <= 0)
...
parm.3.span = 4;
parm.3.dtype = {.elem_len=4, .version=0, .rank=1, .type=1};
parm.3.dim[0].lbound = 1;
parm.3.dim[0].ubound = 2;
parm.3.dim[0].stride = 1;
parm.3.data = (void *) &i[0];
parm.3.offset = -1;
D.4821 = (integer(kind=8)) sort_2 ((integer(kind=4)[0:] *)
parm.3.data);
Maybe the write statement is interfering?