re PR fortran/68534 (No error on mismatch in number of arguments between submodule...
authorPaul Thomas <pault@gcc.gnu.org>
Mon, 30 Nov 2015 13:33:27 +0000 (13:33 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Mon, 30 Nov 2015 13:33:27 +0000 (13:33 +0000)
2015-11-30  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-30  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/68534
* gfortran.dg/submodule_13.f08: New test.

From-SVN: r231072

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/submodule_13.f08 [new file with mode: 0644]

index f1ad5e1f2b5bc0a563f53ec584fdd318c18c2f93..c7c50647d006e488c177d36de4fa08af21586b1b 100644 (file)
@@ -1,3 +1,10 @@
+2015-11-30  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-25  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/68227
@@ -68,7 +75,7 @@
        * resolve.c (gfc_resolve_blocks): Handle EXEC_OACC_DECLARE.
        * st.c (gfc_free_statement): Handle EXEC_OACC_DECLARE.
        * symbol.c (check_conflict): Add conflict checks.
-       (gfc_add_oacc_declare_create, gfc_add_oacc_declare_copyin, 
+       (gfc_add_oacc_declare_create, gfc_add_oacc_declare_copyin,
        gfc_add_oacc_declare_deviceptr, gfc_add_oacc_declare_device_resident):
        New functions.
        (gfc_copy_attr): Handle new symbols.
@@ -84,7 +91,7 @@
 2015-11-21  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        * simplify.c (gfc_simplify_cshift): Work around bootstrap issues
-       due to inappropriate warning options. 
+       due to inappropriate warning options.
 
 2015-11-21  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        (gfc_simplify_spread): Remove a FIXME and add error condition.
        * intrinsic.h: Prototype for gfc_simplify_cshift
        * intrinsic.c (add_functions): Use gfc_simplify_cshift.
+
 2015-11-20  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/68237
index c4ce18b9ad9d3fd68ce04cecaf5ff8bbf1d4cdcc..10a08e0591be64e91c7be490ee00fb5408665667 100644 (file)
@@ -4817,14 +4817,23 @@ ok:
       goto cleanup;
     }
 
-  if (formal)
+  if (progname->attr.module_procedure && progname->attr.host_assoc)
     {
+      bool arg_count_mismatch = false;
+
+      if (!formal && head)
+       arg_count_mismatch = true;
+
+      /* Abbreviated 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))
-           gfc_error_now ("Mismatch in number of MODULE PROCEDURE "
-                          "formal arguments at %C");
+           arg_count_mismatch = true;
          else if ((p->sym == NULL && q->sym == NULL)
                    || strcmp (p->sym->name, q->sym->name) == 0)
            continue;
@@ -4833,6 +4842,10 @@ ok:
                           "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 546bc2e355e80490f905727f19d8b15281de5ce7..805d7943d2570fa810568253a1a972bd6c316636 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-30  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/68534
+       * gfortran.dg/submodule_13.f08: New test.
+
 2015-11-30  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        * gcc.target/s390/load-relative-check.c: Add scan patterns for
diff --git a/gcc/testsuite/gfortran.dg/submodule_13.f08 b/gcc/testsuite/gfortran.dg/submodule_13.f08
new file mode 100644 (file)
index 0000000..6a4d2ad
--- /dev/null
@@ -0,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