Re: [Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface

2015-12-05 Thread Paul Richard Thomas
Committed revision as 231319.

Thanks for testing the patch.

Paul

On 5 December 2015 at 17:41, Steve Kargl
 wrote:
> On Sat, Dec 05, 2015 at 04:20:54PM +0100, Paul Richard Thomas wrote:
>>
>> The cause of the segfault, I believe, was an error: 'sym' being used
>> instead of 'progname': Could you please try the attached patch when
>> you have a moment.
>
> Patch fixes the issue of i386-*-freebsd.  Thanks for the
> prompt fix.  OK to commit (with ChangeLog, of course).
>
> --
> Steve



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx


Re: [Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface

2015-12-03 Thread Paul Richard Thomas
Dear Steve,

I'll take a look at this this afternoon. Thanks for bringing it to my attention.

Cheers

Paul

On 3 December 2015 at 07:43, Steve Kargl
 wrote:
> On Wed, Dec 02, 2015 at 10:26:30PM -0800, Steve Kargl wrote:
>> On Wed, Dec 02, 2015 at 10:02:33PM -0800, Steve Kargl wrote:
>> > Paul,
>> >
>> > I'm stumped.  Something is broken on i386-*-freebsd. :-(
>> >
>> > Running /mnt/kargl/gcc/gcc/testsuite/gfortran.dg/dg.exp ...
>> > FAIL: gfortran.dg/submodule_10.f08   -O  (internal compiler error)
>> > FAIL: gfortran.dg/submodule_10.f08   -O  (test for excess errors)
>> > FAIL: gfortran.dg/submodule_11.f08   -O0  (internal compiler error)
>> > FAIL: gfortran.dg/submodule_11.f08   -O0  (test for excess errors)
>> > FAIL: gfortran.dg/submodule_11.f08   -O1  (internal compiler error)
>> > FAIL: gfortran.dg/submodule_11.f08   -O1  (test for excess errors)
>> > FAIL: gfortran.dg/submodule_11.f08   -O2  (internal compiler error)
>> > FAIL: gfortran.dg/submodule_11.f08   -O2  (test for excess errors)
>> > FAIL: gfortran.dg/submodule_11.f08   -O3 -fomit-frame-pointer 
>> > -funroll-loops -fpeel-loops -ftracer -finline-functions  (internal 
>> > compiler error)
>> > FAIL: gfortran.dg/submodule_11.f08   -O3 -fomit-frame-pointer 
>> > -funroll-loops -fpeel-loops -ftracer -finline-functions  (test for excess 
>> > errors)
>> > FAIL: gfortran.dg/submodule_11.f08   -O3 -g  (internal compiler error)
>> > FAIL: gfortran.dg/submodule_11.f08   -O3 -g  (test for excess errors)
>> > FAIL: gfortran.dg/submodule_11.f08   -Os  (internal compiler error)
>> > FAIL: gfortran.dg/submodule_11.f08   -Os  (test for excess errors)
>>
>> Well, if I change the order of the conditionals decl.c:4831, I
>> can get rid of the above FAILs.
>>
>> Index: decl.c
>> ===
>> --- decl.c  (revision 231219)
>> +++ decl.c  (working copy)
>> @@ -4826,7 +4826,7 @@ ok:
>>
>>/* Abbreviated module procedure declaration is not meant to have any
>>  formal arguments!  */
>> -  if (!sym->abr_modproc_decl && formal && !head)
>> +  if (formal && !head && sym && !sym->abr_modproc_decl)
>> arg_count_mismatch = true;
>>
>>for (p = formal, q = head; p && q; p = p->next, q = q->next)
>>
>> --
>> steve
>>
>> > FAIL: gfortran.dg/submodule_13.f08   -O  (internal compiler error)
>> > FAIL: gfortran.dg/submodule_13.f08   -O   (test for errors, line 29)
>> > FAIL: gfortran.dg/submodule_13.f08   -O  (test for excess errors)
>
> These ICEs persist at line 4831.  In looking at the code, I'm
> now somewhat unsure what it should be doing.  In particular,
> there are 2 gfc_error_now() calls in the below:
>
>
>   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;
>   else
> gfc_error_now ("Mismatch in MODULE PROCEDURE formal "
>"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;
>
> cleanup:
>   gfc_free_formal_arglist (head);
>   return m;
>
> But, we return MATCH_YES?  I would expect setting m = MATCH_ERROR
> and jumping to cleanup.  That's ugly.
>
> --
> Steve



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx


Re: [Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface

2015-12-02 Thread Steve Kargl
On Wed, Dec 02, 2015 at 10:26:30PM -0800, Steve Kargl wrote:
> On Wed, Dec 02, 2015 at 10:02:33PM -0800, Steve Kargl wrote:
> > Paul,
> > 
> > I'm stumped.  Something is broken on i386-*-freebsd. :-(
> > 
> > Running /mnt/kargl/gcc/gcc/testsuite/gfortran.dg/dg.exp ...
> > FAIL: gfortran.dg/submodule_10.f08   -O  (internal compiler error)
> > FAIL: gfortran.dg/submodule_10.f08   -O  (test for excess errors)
> > FAIL: gfortran.dg/submodule_11.f08   -O0  (internal compiler error)
> > FAIL: gfortran.dg/submodule_11.f08   -O0  (test for excess errors)
> > FAIL: gfortran.dg/submodule_11.f08   -O1  (internal compiler error)
> > FAIL: gfortran.dg/submodule_11.f08   -O1  (test for excess errors)
> > FAIL: gfortran.dg/submodule_11.f08   -O2  (internal compiler error)
> > FAIL: gfortran.dg/submodule_11.f08   -O2  (test for excess errors)
> > FAIL: gfortran.dg/submodule_11.f08   -O3 -fomit-frame-pointer 
> > -funroll-loops -fpeel-loops -ftracer -finline-functions  (internal compiler 
> > error)
> > FAIL: gfortran.dg/submodule_11.f08   -O3 -fomit-frame-pointer 
> > -funroll-loops -fpeel-loops -ftracer -finline-functions  (test for excess 
> > errors)
> > FAIL: gfortran.dg/submodule_11.f08   -O3 -g  (internal compiler error)
> > FAIL: gfortran.dg/submodule_11.f08   -O3 -g  (test for excess errors)
> > FAIL: gfortran.dg/submodule_11.f08   -Os  (internal compiler error)
> > FAIL: gfortran.dg/submodule_11.f08   -Os  (test for excess errors)
> 
> Well, if I change the order of the conditionals decl.c:4831, I 
> can get rid of the above FAILs.
> 
> Index: decl.c
> ===
> --- decl.c  (revision 231219)
> +++ decl.c  (working copy)
> @@ -4826,7 +4826,7 @@ ok:
>  
>/* Abbreviated module procedure declaration is not meant to have any
>  formal arguments!  */
> -  if (!sym->abr_modproc_decl && formal && !head)
> +  if (formal && !head && sym && !sym->abr_modproc_decl)
> arg_count_mismatch = true;
>  
>for (p = formal, q = head; p && q; p = p->next, q = q->next)
> 
> -- 
> steve
> 
> > FAIL: gfortran.dg/submodule_13.f08   -O  (internal compiler error)
> > FAIL: gfortran.dg/submodule_13.f08   -O   (test for errors, line 29)
> > FAIL: gfortran.dg/submodule_13.f08   -O  (test for excess errors)

These ICEs persist at line 4831.  In looking at the code, I'm
now somewhat unsure what it should be doing.  In particular, 
there are 2 gfc_error_now() calls in the below:


  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;
  else
gfc_error_now ("Mismatch in MODULE PROCEDURE formal "
   "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;

cleanup:
  gfc_free_formal_arglist (head);
  return m;

But, we return MATCH_YES?  I would expect setting m = MATCH_ERROR
and jumping to cleanup.  That's ugly.

-- 
Steve


Re: [Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface

2015-12-02 Thread Steve Kargl
On Wed, Dec 02, 2015 at 10:02:33PM -0800, Steve Kargl wrote:
> Paul,
> 
> I'm stumped.  Something is broken on i386-*-freebsd. :-(
> 
> Running /mnt/kargl/gcc/gcc/testsuite/gfortran.dg/dg.exp ...
> FAIL: gfortran.dg/submodule_10.f08   -O  (internal compiler error)
> FAIL: gfortran.dg/submodule_10.f08   -O  (test for excess errors)
> FAIL: gfortran.dg/submodule_11.f08   -O0  (internal compiler error)
> FAIL: gfortran.dg/submodule_11.f08   -O0  (test for excess errors)
> FAIL: gfortran.dg/submodule_11.f08   -O1  (internal compiler error)
> FAIL: gfortran.dg/submodule_11.f08   -O1  (test for excess errors)
> FAIL: gfortran.dg/submodule_11.f08   -O2  (internal compiler error)
> FAIL: gfortran.dg/submodule_11.f08   -O2  (test for excess errors)
> FAIL: gfortran.dg/submodule_11.f08   -O3 -fomit-frame-pointer -funroll-loops 
> -fpeel-loops -ftracer -finline-functions  (internal compiler error)
> FAIL: gfortran.dg/submodule_11.f08   -O3 -fomit-frame-pointer -funroll-loops 
> -fpeel-loops -ftracer -finline-functions  (test for excess errors)
> FAIL: gfortran.dg/submodule_11.f08   -O3 -g  (internal compiler error)
> FAIL: gfortran.dg/submodule_11.f08   -O3 -g  (test for excess errors)
> FAIL: gfortran.dg/submodule_11.f08   -Os  (internal compiler error)
> FAIL: gfortran.dg/submodule_11.f08   -Os  (test for excess errors)

Well, if I change the order of the conditionals decl.c:4831, I 
can get rid of the above FAILs.

Index: decl.c
===
--- decl.c  (revision 231219)
+++ decl.c  (working copy)
@@ -4826,7 +4826,7 @@ ok:
 
   /* Abbreviated module procedure declaration is not meant to have any
 formal arguments!  */
-  if (!sym->abr_modproc_decl && formal && !head)
+  if (formal && !head && sym && !sym->abr_modproc_decl)
arg_count_mismatch = true;
 
   for (p = formal, q = head; p && q; p = p->next, q = q->next)

-- 
steve

> FAIL: gfortran.dg/submodule_13.f08   -O  (internal compiler error)
> FAIL: gfortran.dg/submodule_13.f08   -O   (test for errors, line 29)
> FAIL: gfortran.dg/submodule_13.f08   -O  (test for excess errors)
> 
> Using valgrind on 'f951 submodule_10.f08' yields
> 
> laptop-kargl:kargl[324] valgrind 
> ~/work/libexec/gcc/i386-unknown-freebsd11.0/6.0.0/f951 submodule_10.f08
> ==74201== Memcheck, a memory error detector
> ==74201== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
> ==74201== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
> ==74201== Command: 
> /home/kargl/work/libexec/gcc/i386-unknown-freebsd11.0/6.0.0/f951 
> submodule_10.f08
> ==74201== 
> ==74201== Use of uninitialised value of size 4
> ==74201==at 0x81DC20C: gfc_match_formal_arglist(gfc_symbol*, int, int) 
> (decl.c:4829)
> ==74201==by 0x81DE6F7: gfc_match_subroutine() (decl.c:6016)
> ==74201==by 0x8248FC0: decode_statement() (parse.c:378)
> ==74201==by 0x8247844: next_free (parse.c:1076)
> ==74201==by 0x8247844: next_statement() (parse.c:1310)
> ==74201==by 0x8258ACC: parse_contained(int) (parse.c:5038)
> ==74201==by 0x824870F: parse_module() (parse.c:5431)
> ==74201==by 0x82467D4: gfc_parse_file() (parse.c:5729)
> ==74201==by 0x82972E7: gfc_be_parse_file() (f95-lang.c:201)
> ==74201==by 0x87E4787: compile_file() (toplev.c:464)
> ==74201==by 0x87E43E4: do_compile (toplev.c:1951)
> ==74201==by 0x87E43E4: toplev::main(int, char**) (toplev.c:2058)
> ==74201==by 0x8FCC00D: main (main.c:39)
> ==74201== 
> ==74201== Invalid read of size 1
> ==74201==at 0x81DC20C: gfc_match_formal_arglist(gfc_symbol*, int, int) 
> (decl.==74201==at 0x81DC20C: gfc_match_formal_arglist(gfc_symbol*, int, 
> int) (decl.c:4829)
> ==74201==by 0x81DE6F7: gfc_match_subroutine() (decl.c:6016)
> ==74201==by 0x8248FC0: decode_statement() (parse.c:378)
> ==74201==by 0x8247844: next_free (parse.c:1076)
> ==74201==by 0x8247844: next_statement() (parse.c:1310)
> ==74201==by 0x8258ACC: parse_contained(int) (parse.c:5038)
> ==74201==by 0x824870F: parse_module() (parse.c:5431)
> ==74201==by 0x82467D4: gfc_parse_file() (parse.c:5729)
> ==74201==by 0x82972E7: gfc_be_parse_file() (f95-lang.c:201)
> ==74201==by 0x87E4787: compile_file() (toplev.c:464)
> ==74201==by 0x87E43E4: do_compile (toplev.c:1951)
> ==74201==by 0x87E43E4: toplev::main(int, char**) (toplev.c:2058)
> ==74201==by 0x8FCC00D: main (main.c:39)
> ==74201==  Address 0x8094 is not stack'd, malloc'd or (recently) free'd
> ==74201== 
> 
> 
> I suspect that we have a sym=NULL dereferenc someplace.
> 
> -- 
> steve
> 
> 
> On Mon, Nov 30, 2015 at 02:35:35PM +0100, Paul Richard Thomas wrote:
> > Committed as revision 231072.
> > 
> > Thanks for the review
> > 
> > Paul
> > 
> > On 28 November 2015 at 17:19, Steve Kargl
> >  wrote:
> > > On Sat, Nov 28, 2015 at 11:35:54AM +0100, Paul Richard Thomas wrote:
> > >> +
> > >> +   /* Abreviated module procedure declaration is not

Re: [Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface

2015-12-02 Thread Steve Kargl
Paul,

I'm stumped.  Something is broken on i386-*-freebsd. :-(

Running /mnt/kargl/gcc/gcc/testsuite/gfortran.dg/dg.exp ...
FAIL: gfortran.dg/submodule_10.f08   -O  (internal compiler error)
FAIL: gfortran.dg/submodule_10.f08   -O  (test for excess errors)
FAIL: gfortran.dg/submodule_11.f08   -O0  (internal compiler error)
FAIL: gfortran.dg/submodule_11.f08   -O0  (test for excess errors)
FAIL: gfortran.dg/submodule_11.f08   -O1  (internal compiler error)
FAIL: gfortran.dg/submodule_11.f08   -O1  (test for excess errors)
FAIL: gfortran.dg/submodule_11.f08   -O2  (internal compiler error)
FAIL: gfortran.dg/submodule_11.f08   -O2  (test for excess errors)
FAIL: gfortran.dg/submodule_11.f08   -O3 -fomit-frame-pointer -funroll-loops 
-fpeel-loops -ftracer -finline-functions  (internal compiler error)
FAIL: gfortran.dg/submodule_11.f08   -O3 -fomit-frame-pointer -funroll-loops 
-fpeel-loops -ftracer -finline-functions  (test for excess errors)
FAIL: gfortran.dg/submodule_11.f08   -O3 -g  (internal compiler error)
FAIL: gfortran.dg/submodule_11.f08   -O3 -g  (test for excess errors)
FAIL: gfortran.dg/submodule_11.f08   -Os  (internal compiler error)
FAIL: gfortran.dg/submodule_11.f08   -Os  (test for excess errors)
FAIL: gfortran.dg/submodule_13.f08   -O  (internal compiler error)
FAIL: gfortran.dg/submodule_13.f08   -O   (test for errors, line 29)
FAIL: gfortran.dg/submodule_13.f08   -O  (test for excess errors)

Using valgrind on 'f951 submodule_10.f08' yields

laptop-kargl:kargl[324] valgrind 
~/work/libexec/gcc/i386-unknown-freebsd11.0/6.0.0/f951 submodule_10.f08
==74201== Memcheck, a memory error detector
==74201== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==74201== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==74201== Command: 
/home/kargl/work/libexec/gcc/i386-unknown-freebsd11.0/6.0.0/f951 
submodule_10.f08
==74201== 
==74201== Use of uninitialised value of size 4
==74201==at 0x81DC20C: gfc_match_formal_arglist(gfc_symbol*, int, int) 
(decl.c:4829)
==74201==by 0x81DE6F7: gfc_match_subroutine() (decl.c:6016)
==74201==by 0x8248FC0: decode_statement() (parse.c:378)
==74201==by 0x8247844: next_free (parse.c:1076)
==74201==by 0x8247844: next_statement() (parse.c:1310)
==74201==by 0x8258ACC: parse_contained(int) (parse.c:5038)
==74201==by 0x824870F: parse_module() (parse.c:5431)
==74201==by 0x82467D4: gfc_parse_file() (parse.c:5729)
==74201==by 0x82972E7: gfc_be_parse_file() (f95-lang.c:201)
==74201==by 0x87E4787: compile_file() (toplev.c:464)
==74201==by 0x87E43E4: do_compile (toplev.c:1951)
==74201==by 0x87E43E4: toplev::main(int, char**) (toplev.c:2058)
==74201==by 0x8FCC00D: main (main.c:39)
==74201== 
==74201== Invalid read of size 1
==74201==at 0x81DC20C: gfc_match_formal_arglist(gfc_symbol*, int, int) 
(decl.==74201==at 0x81DC20C: gfc_match_formal_arglist(gfc_symbol*, int, 
int) (decl.c:4829)
==74201==by 0x81DE6F7: gfc_match_subroutine() (decl.c:6016)
==74201==by 0x8248FC0: decode_statement() (parse.c:378)
==74201==by 0x8247844: next_free (parse.c:1076)
==74201==by 0x8247844: next_statement() (parse.c:1310)
==74201==by 0x8258ACC: parse_contained(int) (parse.c:5038)
==74201==by 0x824870F: parse_module() (parse.c:5431)
==74201==by 0x82467D4: gfc_parse_file() (parse.c:5729)
==74201==by 0x82972E7: gfc_be_parse_file() (f95-lang.c:201)
==74201==by 0x87E4787: compile_file() (toplev.c:464)
==74201==by 0x87E43E4: do_compile (toplev.c:1951)
==74201==by 0x87E43E4: toplev::main(int, char**) (toplev.c:2058)
==74201==by 0x8FCC00D: main (main.c:39)
==74201==  Address 0x8094 is not stack'd, malloc'd or (recently) free'd
==74201== 


I suspect that we have a sym=NULL dereferenc someplace.

-- 
steve


On Mon, Nov 30, 2015 at 02:35:35PM +0100, Paul Richard Thomas wrote:
> Committed as revision 231072.
> 
> Thanks for the review
> 
> Paul
> 
> On 28 November 2015 at 17:19, Steve Kargl
>  wrote:
> > On Sat, Nov 28, 2015 at 11:35:54AM +0100, Paul Richard Thomas wrote:
> >> +
> >> +   /* Abreviated module procedure declaration is not meant to have any
> >
> > s/Abreviated/Abbreviated
> >
> >> +  formal arguments!  */
> >> +   if (!sym->abr_modproc_decl && formal && !head)
> >> + arg_count_mismatch = true;
> >> +
> >
> > OK to commit.
> >
> > --
> > Steve
> 
> 
> 
> -- 
> Outside of a dog, a book is a man's best friend. Inside of a dog it's
> too dark to read.
> 
> Groucho Marx

-- 
Steve


Re: [Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface

2015-11-30 Thread Paul Richard Thomas
Committed as revision 231072.

Thanks for the review

Paul

On 28 November 2015 at 17:19, Steve Kargl
 wrote:
> On Sat, Nov 28, 2015 at 11:35:54AM +0100, Paul Richard Thomas wrote:
>> +
>> +   /* Abreviated module procedure declaration is not meant to have any
>
> s/Abreviated/Abbreviated
>
>> +  formal arguments!  */
>> +   if (!sym->abr_modproc_decl && formal && !head)
>> + arg_count_mismatch = true;
>> +
>
> OK to commit.
>
> --
> Steve



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx


Re: [Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface

2015-11-28 Thread Steve Kargl
On Sat, Nov 28, 2015 at 11:35:54AM +0100, Paul Richard Thomas wrote:
> + 
> +   /* Abreviated module procedure declaration is not meant to have any

s/Abreviated/Abbreviated

> +  formal arguments!  */
> +   if (!sym->abr_modproc_decl && formal && !head)
> + arg_count_mismatch = true;
> + 

OK to commit.

-- 
Steve


[Patch, fortran] PR68534 - No error on mismatch in number of arguments between submodule and module interface

2015-11-28 Thread Paul Richard Thomas
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  

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  

PR fortran/68534
* gfortran.dg/submodule_13.f08: New test.
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