https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114859
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I see there roughly module m1 type amg_d_base_solver_type contains procedure, pass(sv) :: apply_v => amg_d_base_solver_apply_vect procedure, pass(sv) :: apply_a => amg_d_base_solver_apply end type amg_d_base_solver_type interface subroutine amg_d_base_solver_apply_vect(alpha,sv,x) implicit none class(amg_d_base_solver_type), intent(inout) :: sv integer,intent(inout) :: x real,intent(in) :: alpha end subroutine amg_d_base_solver_apply_vect end interface interface subroutine amg_d_base_solver_apply(alpha,sv,x) implicit none class(amg_d_base_solver_type), intent(inout) :: sv integer,intent(inout) :: x real,intent(in) :: alpha end subroutine amg_d_base_solver_apply end interface end module m1 module m2 use m1 type amg_d_base_smoother_type class(amg_d_base_solver_type), allocatable :: sv contains procedure, pass(sm) :: apply_v => amg_d_base_smoother_apply_vect procedure, pass(sm) :: apply_a => amg_d_base_smoother_apply end type amg_d_base_smoother_type interface subroutine amg_d_base_smoother_apply_vect(alpha,sm,x) implicit none class(amg_s_base_smoother_type), intent(inout) :: sm integer,intent(inout) :: x real,intent(in) :: alpha end subroutine amg_d_base_smoother_apply_vect end interface interface subroutine amg_d_base_smoother_apply(alpha,sm,x) implicit none class(amg_s_base_smoother_type), intent(inout) :: sm integer,intent(inout) :: x real,intent(in) :: alpha end subroutine amg_d_base_smoother_apply end interface end module m2 subroutine foo (save1) use m1, m2 class(amg_d_base_smoother_type), allocatable , intent(inout) :: save1 allocate(save1) end subroutine except that this doesn't compile.