https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93918
--- Comment #4 from martin <mscfd at gmx dot net> --- After playing around a bit I am really confused about why and when array temporaries are created. The variant ppp_1 with a non-contiguous array pointer p works fine (with -Ofast), but the variation ppp_2 (this time even with a contiguous array pointer) fails. To make it even more puzzling, variation ppp_3, where the pointer association is done in a function, works. To me it seems obscure to understand and thus avoid creation of temporary arrays. program ppp_1 use mod implicit none integer :: n integer, dimension(:,:), pointer :: a integer, dimension(:), pointer :: p n = 100000000 allocate(a(1:2,1:n), source=1) p => a(1,1:n) call foo(p, n) deallocate(a) end program ppp_1 program ppp_2 use mod implicit none type :: tt integer :: u = 1 end type tt type(tt), dimension(:), pointer :: r integer :: n integer, dimension(:), pointer :: p n = 100000000 allocate(r(1:n)) p => r(:)%u call foo(p, n) deallocate(r) end program ppp_2 program ppp_3 use mod implicit none type :: tt integer :: u = 1 end type tt type(tt), dimension(:), pointer :: r integer :: n integer, dimension(:), pointer :: p n = 100000000 allocate(r(1:n)) p => get(r(1:n)) call foo(p, n) deallocate(r) contains function get(x) result(q) type(tt), dimension(:), target, intent(in) :: x integer, dimension(:), pointer :: q q => x(:)%u end function get end program ppp_3