https://gcc.gnu.org/g:64a551f730564af58c83d2748436c9d90543fe1a

commit r15-7964-g64a551f730564af58c83d2748436c9d90543fe1a
Author: Thomas Koenig <tkoe...@gcc.gnu.org>
Date:   Tue Mar 11 17:40:57 2025 +0100

    Abstract interfaces and dummy arguments are not global.
    
    The attached patch makes sure that procedures from abstract
    interfaces and dummy arguments are not put into the global
    symbol table, and are not checked against global symbols.
    
    gcc/fortran/ChangeLog:
    
            PR fortran/119078
            * frontend-passes.cc (check_against_globals): Do not check
            for abstract interfaces or dummy arguments.
            * resolve.cc (gfc_verify_binding_labels): Adjust comment.
            Do not put abstract interfaces or dummy argument into global
            namespace.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/119078
            * gfortran.dg/interface_58.f90: New test.

Diff:
---
 gcc/fortran/frontend-passes.cc             |  3 ++-
 gcc/fortran/resolve.cc                     |  6 +++--
 gcc/testsuite/gfortran.dg/interface_58.f90 | 38 ++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/frontend-passes.cc b/gcc/fortran/frontend-passes.cc
index 20bf6e127ffc..ef9c80147cc4 100644
--- a/gcc/fortran/frontend-passes.cc
+++ b/gcc/fortran/frontend-passes.cc
@@ -5799,7 +5799,8 @@ check_against_globals (gfc_symbol *sym)
   char buf  [200];
 
   if (sym->attr.if_source != IFSRC_IFBODY || sym->attr.flavor != FL_PROCEDURE
-      || sym->attr.generic || sym->error)
+      || sym->attr.generic || sym->error || sym->attr.abstract
+      || sym->attr.dummy)
     return;
 
   if (sym->binding_label)
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index eda31ba8adc3..027c99335d15 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -13883,7 +13883,8 @@ gfc_verify_DTIO_procedures (gfc_symbol *sym)
 
 /* Verify that any binding labels used in a given namespace do not collide
    with the names or binding labels of any global symbols.  Multiple INTERFACE
-   for the same procedure are permitted.  */
+   for the same procedure are permitted.  Abstract interfaces and dummy
+   arguments are not checked.  */
 
 static void
 gfc_verify_binding_labels (gfc_symbol *sym)
@@ -13892,7 +13893,8 @@ gfc_verify_binding_labels (gfc_symbol *sym)
   const char *module;
 
   if (!sym || !sym->attr.is_bind_c || sym->attr.is_iso_c
-      || sym->attr.flavor == FL_DERIVED || !sym->binding_label)
+      || sym->attr.flavor == FL_DERIVED || !sym->binding_label
+      || sym->attr.abstract || sym->attr.dummy)
     return;
 
   gsym = gfc_find_case_gsymbol (gfc_gsym_root, sym->binding_label);
diff --git a/gcc/testsuite/gfortran.dg/interface_58.f90 
b/gcc/testsuite/gfortran.dg/interface_58.f90
new file mode 100644
index 000000000000..52f3651567fa
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/interface_58.f90
@@ -0,0 +1,38 @@
+! { dg-do compile }
+! PR 119078 - there should be no warning for dummy arguments
+! or abstract interfaces.
+module x
+  implicit none
+  abstract interface
+     subroutine foo() bind(c)
+     end subroutine foo
+  end interface
+  interface
+     subroutine baz() bind(c) ! { dg-warning "wrong number of arguments" }
+     end subroutine baz
+  end interface
+contains
+  subroutine tescht(bar) bind(c)
+    interface
+       subroutine bar() bind(c)
+       end subroutine bar
+    end interface
+  end subroutine tescht
+  subroutine t2(bar) bind(c)
+    procedure(foo) :: bar
+  end subroutine t2
+end module x
+
+subroutine foo(a)
+  real :: a
+end subroutine foo
+
+subroutine bar(b)
+  real :: b
+end subroutine bar
+
+subroutine baz(a) bind(c) ! { dg-warning "wrong number of arguments" }
+  use iso_c_binding, only : c_int
+  integer(c_int) :: a
+end subroutine baz
+

Reply via email to