Index: gcc/fortran/decl.c =================================================================== --- gcc/fortran/decl.c (revision 270181) +++ gcc/fortran/decl.c (working copy) @@ -6070,7 +6070,29 @@ 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 can be matched. Note that if nothing matches, MATCH_YES is @@ -6102,6 +6124,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: gcc/testsuite/gfortran.dg/submodule_22.f08 =================================================================== --- gcc/testsuite/gfortran.dg/submodule_22.f08 (revision 270181) +++ gcc/testsuite/gfortran.dg/submodule_22.f08 (working copy) @@ -40,8 +40,10 @@ 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 + +found outside of a module