https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110576
--- Comment #3 from Jürgen Reuter <juergen.reuter at desy dot de> --- Here is a mininal reproducer: module process_mci implicit none private public :: process_mci_entry_t type :: process_mci_entry_t integer :: i_mci = 0 integer, dimension(:), allocatable :: i_component integer :: n_it = 0 end type process_mci_entry_t end module process_mci module pcm_base use process_mci, only: process_mci_entry_t implicit none private public :: pcm_t public :: pcm_workspace_t type, abstract :: pcm_t integer :: n_components = 0 integer :: n_cores = 0 integer :: n_mci = 0 logical, dimension(:), allocatable :: component_selected logical, dimension(:), allocatable :: component_active integer, dimension(:), allocatable :: i_core integer, dimension(:), allocatable :: i_mci contains procedure(pcm_setup_mci), deferred :: setup_mci end type pcm_t type, abstract :: pcm_workspace_t logical :: bad_point = .false. end type pcm_workspace_t abstract interface subroutine pcm_setup_mci (pcm, mci_entry) import class(pcm_t), intent(inout) :: pcm type(process_mci_entry_t), & dimension(:), allocatable, intent(out) :: mci_entry end subroutine pcm_setup_mci end interface end module pcm_base module pcm use pcm_base use process_mci, only: process_mci_entry_t implicit none private public :: pcm_def_t type, extends (pcm_t) :: pcm_def_t contains procedure :: setup_mci => pcm_def_setup_mci end type pcm_def_t type, extends (pcm_workspace_t) :: pcm_def_workspace_t end type pcm_def_workspace_t interface module subroutine pcm_def_setup_mci (pcm, mci_entry) class(pcm_def_t), intent(inout) :: pcm type(process_mci_entry_t), & dimension(:), allocatable, intent(out) :: mci_entry end subroutine pcm_def_setup_mci end interface end module pcm submodule (pcm) pcm_s use process_mci, only: process_mci_entry_t implicit none contains module subroutine pcm_def_setup_mci (pcm, mci_entry) class(pcm_def_t), intent(inout) :: pcm type(process_mci_entry_t), & dimension(:), allocatable, intent(out) :: mci_entry integer :: i, i_mci allocate (mci_entry (pcm%n_mci)) end subroutine pcm_def_setup_mci end submodule pcm_s module process use pcm_base use pcm use process_mci implicit none private public :: process_t type :: process_t private class(pcm_t), allocatable :: & pcm type(process_mci_entry_t), dimension(:), allocatable :: & mci_entry contains procedure :: setup_mci => process_setup_mci end type process_t interface module subroutine process_setup_mci (process) class(process_t), intent(inout) :: process end subroutine process_setup_mci end interface end module process submodule (process) process_s implicit none contains module subroutine process_setup_mci (process) class(process_t), intent(inout) :: process integer :: i, i_mci associate (pcm => process%pcm) !!! This triggers the ICE call pcm%setup_mci (process%mci_entry) end associate end subroutine process_setup_mci end submodule process_s program main_ut implicit none end program main_ut