PING. On Fri, Oct 04, 2019 at 03:26:53PM -0700, Steve Kargl wrote: > The attached patch allows the declaration of a BIND(C) > module function or module subroutine to appear in a > submodule (see testcases). Regression test was clean. > OK to commit? > > Before a rubber stamped 'OK'. I do NOT use submodules. > A submodule user needs to pipe up on the validity of > the patch. > > > 2019-10-04 Steven G. Kargl <ka...@gcc.gnu.org> > > PR fortran/89943 > decl.c (gfc_match_function_decl): Ignore duplicate BIND(C) for function > declaration in submodule. > (gfc_match_entry): Use temporary for locus, which allows removal of > one gfc_error_now(). > (gfc_match_subroutine): Ignore duplicate BIND(C) for subroutine > declaration in submodule. > > 2019-10-04 Steven G. Kargl <ka...@gcc.gnu.org> > > PR fortran/89943 > * gfortran.dg/pr89943_1.f90: New test. > * gfortran.dg/pr89943_2.f90: Ditto. > > -- > Steve
> Index: gcc/fortran/decl.c > =================================================================== > --- gcc/fortran/decl.c (revision 276601) > +++ gcc/fortran/decl.c (working copy) > @@ -7259,13 +7259,16 @@ gfc_match_function_decl (void) > if (sym->attr.is_bind_c == 1) > { > sym->attr.is_bind_c = 0; > - if (sym->old_symbol != NULL) > - gfc_error_now ("BIND(C) attribute at %L can only be used for " > - "variables or common blocks", > - &(sym->old_symbol->declared_at)); > - else > - gfc_error_now ("BIND(C) attribute at %L can only be used for " > - "variables or common blocks", &gfc_current_locus); > + > + if (gfc_state_stack->previous > + && gfc_state_stack->previous->state != COMP_SUBMODULE) > + { > + locus loc; > + loc = sym->old_symbol != NULL > + ? sym->old_symbol->declared_at : gfc_current_locus; > + gfc_error_now ("BIND(C) attribute at %L can only be used for " > + "variables or common blocks", &loc); > + } > } > > if (found_match != MATCH_YES) > @@ -7517,16 +7520,16 @@ gfc_match_entry (void) > not allowed for procedures. */ > if (entry->attr.is_bind_c == 1) > { > + locus loc; > + > entry->attr.is_bind_c = 0; > - if (entry->old_symbol != NULL) > - gfc_error_now ("BIND(C) attribute at %L can only be used for " > - "variables or common blocks", > - &(entry->old_symbol->declared_at)); > - else > - gfc_error_now ("BIND(C) attribute at %L can only be used for " > - "variables or common blocks", &gfc_current_locus); > - } > > + loc = entry->old_symbol != NULL > + ? entry->old_symbol->declared_at : gfc_current_locus; > + gfc_error_now ("BIND(C) attribute at %L can only be used for " > + "variables or common blocks", &loc); > + } > + > /* Check what next non-whitespace character is so we can tell if there > is the required parens if we have a BIND(C). */ > old_loc = gfc_current_locus; > @@ -7725,13 +7728,16 @@ gfc_match_subroutine (void) > if (sym->attr.is_bind_c == 1) > { > sym->attr.is_bind_c = 0; > - if (sym->old_symbol != NULL) > - gfc_error_now ("BIND(C) attribute at %L can only be used for " > - "variables or common blocks", > - &(sym->old_symbol->declared_at)); > - else > - gfc_error_now ("BIND(C) attribute at %L can only be used for " > - "variables or common blocks", &gfc_current_locus); > + > + if (gfc_state_stack->previous > + && gfc_state_stack->previous->state != COMP_SUBMODULE) > + { > + locus loc; > + loc = sym->old_symbol != NULL > + ? sym->old_symbol->declared_at : gfc_current_locus; > + gfc_error_now ("BIND(C) attribute at %L can only be used for " > + "variables or common blocks", &loc); > + } > } > > /* C binding names are not allowed for internal procedures. */ > Index: gcc/testsuite/gfortran.dg/pr89943_1.f90 > =================================================================== > --- gcc/testsuite/gfortran.dg/pr89943_1.f90 (nonexistent) > +++ gcc/testsuite/gfortran.dg/pr89943_1.f90 (working copy) > @@ -0,0 +1,31 @@ > +! { dg-do compile } > +! PR fortran/89943 > +! Code contributed by Alberto Luaces <aluaces at udc dot se> > +module Foo_mod > + > + implicit none > + > + interface > + module subroutine runFoo4C(ndim) bind(C, name="runFoo") > + use, intrinsic :: iso_c_binding > + implicit none > + integer(c_int32_t) , intent(in) :: ndim > + end subroutine runFoo4C > + end interface > + > + contains > + > +end module Foo_mod > + > +submodule(Foo_mod) Foo_smod > + > + contains > + > + module subroutine runFoo4C(ndim) bind(C, name="runFoo") > + use, intrinsic :: iso_c_binding > + implicit none > + integer(c_int32_t) , intent(in) :: ndim > + end subroutine runFoo4C > + > +end submodule Foo_smod > + > Index: gcc/testsuite/gfortran.dg/pr89943_2.f90 > =================================================================== > --- gcc/testsuite/gfortran.dg/pr89943_2.f90 (nonexistent) > +++ gcc/testsuite/gfortran.dg/pr89943_2.f90 (working copy) > @@ -0,0 +1,33 @@ > +! { dg-do compile } > +! PR fortran/89943 > +! Code contributed by Alberto Luaces <aluaces at udc dot se> > +module Foo_mod > + > + implicit none > + > + interface > + module function runFoo4C(ndim) bind(C, name="runFoo") > + use, intrinsic :: iso_c_binding > + implicit none > + integer runFoo4c > + integer(c_int32_t) , intent(in) :: ndim > + end function runFoo4C > + end interface > + > + contains > + > +end module Foo_mod > + > +submodule(Foo_mod) Foo_smod > + > + contains > + > + module function runFoo4C(ndim) bind(C, name="runFoo") > + use, intrinsic :: iso_c_binding > + implicit none > + integer runFoo4c > + integer(c_int32_t) , intent(in) :: ndim > + end function runFoo4C > + > +end submodule Foo_smod > + -- Steve 20170425 https://www.youtube.com/watch?v=VWUpyCsUKR4 20161221 https://www.youtube.com/watch?v=IbCHE-hONow