https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106771
--- Comment #5 from federico <federico.perini at gmail dot com> --- My bad, the SEGFAULT is my mistake, I've made a half-baked example that does not work. Here's the fixed one: module test implicit none type::t integer, allocatable :: iloc(:) contains procedure :: is_active => isa procedure :: list2loc => myfun_poly end type t contains elemental logical function isa(this,i) class(t), intent(in) :: this integer, intent(in) :: i integer :: n n = merge(size(this%iloc),0,allocated(this%iloc)) if (i>0 .and. i<=n) then ! Segmentation fault here isa = this%iloc(i)>0 else isa = .false. endif end function isa ! internal compiler error: in gfc_conv_expr_descriptor, at fortran/trans-array.c:7328 function myfun_poly(this,IDs) result (ilocs) class(t), intent(in) :: this integer, intent(in) :: IDs(:) integer, allocatable :: ilocs(:) if (size(IDs)<=0) then allocate(ilocs(0)) else ilocs = pack(this%iloc(IDs),this%is_active(IDs)) endif end function myfun_poly ! WORKS function myfun(this,IDs) result (ilocs) type(t), intent(in) :: this integer, intent(in) :: IDs(:) integer, allocatable :: ilocs(:) if (size(IDs)<=0) then allocate(ilocs(0)) else ilocs = pack(this%iloc(IDs),this%is_active(IDs)) endif end function myfun end module test program testp use test implicit none type(t) :: a integer :: rnd(100),i real :: x(100) integer, allocatable :: list(:) ! Create a dummy initialization a%iloc = [(i,i=1,100)] call random_number(x); rnd = ceiling(x*99) ! Works print *, 'rnd=',rnd list = myfun(a,rnd) ! ICE list = a%list2loc(rnd) print *, 'list=',list end program testp The segfault is now gone, but the ICE remains for all versions until 10.3.0 (see https://godbolt.org/z/6TKa4sEe9)