re PR fortran/90166 (Compiler Fails at Assembler)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 22 Apr 2019 21:00:40 +0000 (21:00 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 22 Apr 2019 21:00:40 +0000 (21:00 +0000)
2019-04-19  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/90166
* decl.c (in_module_or_interface): New function to check that the
current state is in a module, submodule, or interface.
(gfc_match_prefix): Use it.

2019-04-19  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/90166
* gfortran.dg/submodule_22.f08: Add additional dg-error comments.

From-SVN: r270495

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/submodule_22.f08

index 6a11bf5514bc79ae0523e7db1fe98d6599373b50..12cb55c2dcb9d9e18f69d6b106f0211152f04021 100644 (file)
@@ -1,3 +1,10 @@
+2019-04-19  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/90166
+       * decl.c (in_module_or_interface): New function to check that the
+       current state is in a module, submodule, or interface.
+       (gfc_match_prefix): Use it.
+
 2019-04-22  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/57284
index 749faf9fabefccad11d5b95fe3b1303a56e5bcd9..66f1094aa3d9f45f5d3522a3e1b1b747be2ba241 100644 (file)
@@ -6070,6 +6070,28 @@ cleanup:
   return m;
 }
 
+static bool
+in_module_or_interface(void)
+{
+  if (gfc_current_state () == COMP_MODULE
+      || gfc_current_state () == COMP_SUBMODULE 
+      || gfc_current_state () == COMP_INTERFACE)
+    return true;
+
+  if (gfc_state_stack->state == COMP_CONTAINS
+      || gfc_state_stack->state == COMP_FUNCTION
+      || gfc_state_stack->state == COMP_SUBROUTINE)
+    {
+      gfc_state_data *p;
+      for (p = gfc_state_stack->previous; p ; p = p->previous)
+       {
+         if (p->state == COMP_MODULE || p->state == COMP_SUBMODULE 
+             || p->state == COMP_INTERFACE)
+           return true;
+       }
+    }
+    return false;
+}
 
 /* Match a prefix associated with a function or subroutine
    declaration.  If the typespec pointer is nonnull, then a typespec
@@ -6103,6 +6125,13 @@ gfc_match_prefix (gfc_typespec *ts)
          if (!gfc_notify_std (GFC_STD_F2008, "MODULE prefix at %C"))
            goto error;
 
+         if (!in_module_or_interface ())
+           {
+             gfc_error ("MODULE prefix at %C found outside of a module, "
+                        "submodule, or interface");
+             goto error;
+           }
+
          current_attr.module_procedure = 1;
          found_prefix = true;
        }
index 4d10bfd0b0838704a18a5d52619c9078e358c11c..e22996fde9c6298751d307a73fb1ccac22c842b6 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-22  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/90166
+       * gfortran.dg/submodule_22.f08: Add additional dg-error comments.
+
 2019-04-22  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/57284
index 8ff5421c77eac12b6fa5371ef08c96dae672917a..eab398fd3d3f9be48458e9a7bdb180e176d378ec 100644 (file)
@@ -40,8 +40,8 @@ end
 
 submodule (mtop:submod:subsubmod) subsubsubmod ! { dg-error "Syntax error in SUBMODULE statement" }
 contains
-  module subroutine sub3
-    r = 2.0
-    s = 2.0
-  end subroutine sub3
+  module subroutine sub3  ! { dg-error "found outside of a module" }
+    r = 2.0               ! { dg-error "Unexpected assignment" }
+    s = 2.0               ! { dg-error "Unexpected assignment" }
+  end subroutine sub3     ! { dg-error "Expecting END PROGRAM statement" }
 end