[Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface
Paul Richard Thomas
paul.richard.thomas@gmail.com
Sat Nov 28 10:35:00 GMT 2015
Dear All,
The check that the number of formal arguments in the submodule
procedure declaration is the same as that in the module interface was
not working when there were none in either of them. This rather
trivial patch remedies the problem.
Bootstrapped and regtested on FC21/x86_64 - OK for trunk?
Paul
2015-11-28 Paul Thomas <pault@gcc.gnu.org>
PR fortran/68534
* decl.c (gfc_match_formal_arglist): Cope with zero formal args
either in interface declaration or in procedure declaration in
submodule.
2015-11-28 Paul Thomas <pault@gcc.gnu.org>
PR fortran/68534
* gfortran.dg/submodule_13.f08: New test.
-------------- next part --------------
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
More information about the Fortran
mailing list