Index: gcc/fortran/decl.c =================================================================== *** gcc/fortran/decl.c (revision 230783) --- gcc/fortran/decl.c (working copy) *************** ok: *** 4817,4830 **** goto cleanup; } ! if (formal) { for (p = formal, q = head; p && q; p = p->next, q = q->next) { if ((p->next != NULL && q->next == NULL) || (p->next == NULL && q->next != NULL)) ! gfc_error_now ("Mismatch in number of MODULE PROCEDURE " ! "formal arguments at %C"); else if ((p->sym == NULL && q->sym == NULL) || strcmp (p->sym->name, q->sym->name) == 0) continue; --- 4817,4839 ---- goto cleanup; } ! if (progname->attr.module_procedure && progname->attr.host_assoc) { + bool arg_count_mismatch = false; + + if (!formal && head) + arg_count_mismatch = true; + + /* Abreviated module procedure declaration is not meant to have any + formal arguments! */ + if (!sym->abr_modproc_decl && formal && !head) + arg_count_mismatch = true; + for (p = formal, q = head; p && q; p = p->next, q = q->next) { if ((p->next != NULL && q->next == NULL) || (p->next == NULL && q->next != NULL)) ! arg_count_mismatch = true; else if ((p->sym == NULL && q->sym == NULL) || strcmp (p->sym->name, q->sym->name) == 0) continue; *************** ok: *** 4833,4838 **** --- 4842,4851 ---- "argument names (%s/%s) at %C", p->sym->name, q->sym->name); } + + if (arg_count_mismatch) + gfc_error_now ("Mismatch in number of MODULE PROCEDURE " + "formal arguments at %C"); } return MATCH_YES; Index: gcc/testsuite/gfortran.dg/submodule_13.f08 =================================================================== *** gcc/testsuite/gfortran.dg/submodule_13.f08 (revision 0) --- gcc/testsuite/gfortran.dg/submodule_13.f08 (working copy) *************** *** 0 **** --- 1,32 ---- + ! { dg-do compile } + ! + ! Checks the fix for PR68534 in which checks for the number + ! failed if either the interface or the module procedure had + ! no dummies. + ! + ! Reported on clf at: + ! https://groups.google.com/forum/#!topic/comp.lang.fortran/-ZgbM5qkFmc + ! + module m + implicit none + interface + module subroutine foo() + end subroutine foo + + module subroutine bar(i) + integer, intent(inout) :: i + end subroutine bar + end interface + end module m + + submodule(m) sm + contains + module subroutine foo(i) ! { dg-error "Mismatch in number of MODULE PROCEDURE formal" } + integer, intent(inout) :: i + i = 42 + end subroutine foo + + module subroutine bar ! { dg-error "Mismatch in number of MODULE PROCEDURE formal" } + print *, "bar" + end subroutine bar + end submodule sm