Ping. On Wed, May 01, 2019 at 11:06:08PM -0700, Steve Kargl wrote: > The attach patch adds a check that a module prefix > occurs only in a module, submodule, or interface. > > C1547 (R1526) MODULE shall appear only in the function-stmt or > subroutine-stmt of a module subprogram or of a nonabstract > interface body that is declared in the scoping unit of a > module or submodule. > > The patch has been bootstrapped and regression > tested on x86_64-*-freebsd. OK to commit? > > 2019-04-19 Steven G. Kargl <ka...@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. > > PR fortran/90166 > * gfortran.dg/submodule_22.f08: Add additional dg-error comments. > > -- > Steve
> 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 -- Steve 20170425 https://www.youtube.com/watch?v=VWUpyCsUKR4 20161221 https://www.youtube.com/watch?v=IbCHE-hONow