Re: [PATCH] fortran: Fix host association in module procedure interface bodies [PR79330]

Harald Anlauf <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
Hi Gonzalo,

the latest version of the patch still had whitespace issues:
please next time you should really replace 8 blanks by tabs etc.!

I've fixed this here and pushed as r16-8399-g9e427f335b7311 .

Thanks for the patch!

Harald

Am 01.04.26 um 1:21 PM schrieb Gonzalo Silvalde Blanco:
> Sorry, resending with the patch as attachment. I thought that git
> send-email attached the file.
> 
> El mar, 31 mar 2026 a las 21:59, Harald Anlauf (<[email protected]>) escribió:
>>
>> Hi Gonzalo,
>>
>> the patch looks basically fine, but:
>>
>> 1) please sign it off, like the previous time;
>>
>> 2) please attach it to your mail, don't inline it.
>>
>> Thanks,
>> Harald
>>
>> On 3/28/26 12:35, Gonzalosilvalde wrote:
>>> Named constants from the host scope were not accessible in module
>>> procedure interface bodies, causing bind(C, name=...) expressions
>>> referencing such constants to fail.  The compiler treated the constant
>>> as an implicitly typed REAL(4) variable instead of resolving it from
>>> the enclosing module scope.
>>>
>>> The fix sets has_import_set on the current namespace when a module
>>> procedure is detected inside an interface block, before bind(C) is
>>> parsed, so that symbol lookup can reach the host scope.
>>>
>>> gcc/fortran/ChangeLog:
>>>
>>>        PR fortran/79330
>>>        * decl.cc (gfc_match_subroutine): Set has_import_set when
>>>        matching a module procedure inside an interface block.
>>>        (gfc_match_function_decl): Likewise.
>>>
>>> gcc/testsuite/ChangeLog:
>>>
>>>        PR fortran/79330
>>>        * gfortran.dg/bind_c_module_proc.f90: New test.
>>> ---
>>>    gcc/fortran/decl.cc                            | 12 ++++++++++--
>>>    .../gfortran.dg/bind_c_module_proc.f90         | 18 ++++++++++++++++++
>>>    2 files changed, 28 insertions(+), 2 deletions(-)
>>>    create mode 100644 gcc/testsuite/gfortran.dg/bind_c_module_proc.f90
>>>
>>> diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc
>>> index 454b65f2c47..faf404d994a 100644
>>> --- a/gcc/fortran/decl.cc
>>> +++ b/gcc/fortran/decl.cc
>>> @@ -8191,7 +8191,11 @@ gfc_match_function_decl (void)
>>>        sym = sym->result;
>>>
>>>      if (current_attr.module_procedure)
>>> -    sym->attr.module_procedure = 1;
>>> +    {
>>> +      sym->attr.module_procedure = 1;
>>> +      if (gfc_current_state () == COMP_INTERFACE)
>>> +        gfc_current_ns->has_import_set = 1;
>>> +    }
>>>
>>>      gfc_new_block = sym;
>>>
>>> @@ -8687,7 +8691,11 @@ gfc_match_subroutine (void)
>>>                                             &gfc_current_locus);
>>>
>>>      if (current_attr.module_procedure)
>>> -    sym->attr.module_procedure = 1;
>>> +    {
>>> +      sym->attr.module_procedure = 1;
>>> +      if (gfc_current_state () == COMP_INTERFACE)
>>> +        gfc_current_ns->has_import_set = 1;
>>> +    }
>>>
>>>      if (add_hidden_procptr_result (sym))
>>>        sym = sym->result;
>>> diff --git a/gcc/testsuite/gfortran.dg/bind_c_module_proc.f90 b/gcc/testsuite/gfortran.dg/bind_c_module_proc.f90
>>> new file mode 100644
>>> index 00000000000..2df933f3c14
>>> --- /dev/null
>>> +++ b/gcc/testsuite/gfortran.dg/bind_c_module_proc.f90
>>> @@ -0,0 +1,18 @@
>>> +! { dg-do compile }
>>> +! PR fortran/79330
>>> +! Verify that named constants from the host scope are accessible
>>> +! in module procedure interface bodies for bind(C, name=...).
>>> +
>>> +module m
>>> +  implicit none
>>> +  character(len=*), parameter :: PREFIX = "_gfortran_"
>>> +  interface
>>> +    module subroutine sub() bind(C, name=PREFIX//"caf_sub")
>>> +      implicit none
>>> +    end subroutine
>>> +    module function func() result(r) bind(C, name=PREFIX//"caf_func")
>>> +      implicit none
>>> +      integer :: r
>>> +    end function
>>> +  end interface
>>> +end module
>>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.