Re: [PATCH] PR fortran/90166 -- Add check for module prefix
On Tue, May 07, 2019 at 10:44:34AM +0200, Dominique d'Humières wrote: > Hi Steve, > > > Ping. > > AFAICT this has been committed as revision r270495. > Whoops, you're correct. I have a few too many diffs lying around. -- Steve
Re: [PATCH] PR fortran/90166 -- Add check for module prefix
Hi Steve, > Ping. AFAICT this has been committed as revision r270495. Cheers, Dominique
Re: [PATCH] PR fortran/90166 -- Add check for module prefix
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 > > 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
[PATCH] PR fortran/90166 -- Add check for module prefix
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 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