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

Reply via email to