https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69524

--- Comment #8 from Paul Thomas <pault at gcc dot gnu.org> ---
(In reply to Paul Thomas from comment #7)
> I could be wrong but I do not agree that this is valid code. I will turn to
> it tomorrow. I believe that a MODULE SUBROUTINE/FUNCTION declaration cannot
> appear in the contained part of a module.

It seems that I was wrong. From the Fortran 2008 standard:

C1247 (R1225) MODULE shall appear only in the function-stmt or subroutine-stmt
of a module subprogram or of a nonabstract interface body that is declared in
the scoping unit of a module or submodule.

Modifying the gcc_assert (trans-decl.c:2065) that causes the ICE to
  bool module_procedure;

  module_procedure = sym->attr.module_procedure
                     && sym->ns
                     && sym->ns->proc_name
                     && sym->ns->proc_name->attr.flavor == FL_MODULE;

  gcc_assert (!sym->attr.external || module_procedure);

Gives what seems to be the correct behaviour and allows:
module A

  interface
     module subroutine A1(i)
       integer i
     end subroutine A1
     module subroutine B1(i)
       integer i
     end subroutine B1
  end interface

contains

  module subroutine A1(i)
    integer  i

    print *, 'A::A1(): i == ', i
  end subroutine A1
end module A

submodule (A) a_son
contains
  module procedure b1
    print *, 'A_SON::B1(): Calling A1'
    call a1(i)
  end procedure
end submodule

  use A
  call b1 (42)
end

to do the right thing.

I cannot remember at all where module procedures pick up the external
attribute. It would be better to modify this at source rather than the fix
above :-)

Paul

Reply via email to