[fortran] Fix PR 119078, putting a procedure in an abstract interface into global namespace

Message ID 19318f5a-fd0f-48db-9ec5-3eb661ecb252@netcologne.de
State New
Headers
Series [fortran] Fix PR 119078, putting a procedure in an abstract interface into global namespace |

Commit Message

Thomas Koenig March 10, 2025, 8:01 p.m. UTC
  Hello world,

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.

Regression-tested. OK for trunk?

Best regards

	Thomas

Abstract interfaces and dummy arguments are not global.

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
  

Comments

Harald Anlauf March 10, 2025, 9:34 p.m. UTC | #1
Hi Thomas,

Am 10.03.25 um 21:01 schrieb Thomas Koenig:
> Hello world,
>
> 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.
>
> Regression-tested. OK for trunk?
>
> Best regards
>
>      Thomas
>
> Abstract interfaces and dummy arguments are not global.
>
> 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

the patch looks basically fine but I cannot find the testcase.

Cheers,
Harald
  
Thomas Koenig March 11, 2025, 6:11 a.m. UTC | #2
Am 10.03.25 um 22:34 schrieb Harald Anlauf:

> the patch looks basically fine but I cannot find the testcase.

You're right, here it is.

Best regards

	Thomas
diff --git a/gcc/fortran/frontend-passes.cc b/gcc/fortran/frontend-passes.cc
index 20bf6e127ff..ef9c80147cc 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 eda31ba8adc..027c99335d1 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 00000000000..52f3651567f
--- /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
+
  
Andre Vehreschild March 11, 2025, 9:22 a.m. UTC | #3
Hi Thomas,

looks good to me as well. Thanks for the patch.

Regards,
	Andre

On Tue, 11 Mar 2025 07:11:53 +0100
Thomas Koenig <tkoenig@netcologne.de> wrote:

> Am 10.03.25 um 22:34 schrieb Harald Anlauf:
>
> > the patch looks basically fine but I cannot find the testcase.
>
> You're right, here it is.
>
> Best regards
>
> 	Thomas


--
Andre Vehreschild * Email: vehre ad gmx dot de
  
Thomas Koenig March 11, 2025, 4:45 p.m. UTC | #4
Am 11.03.25 um 10:22 schrieb Andre Vehreschild:
> Hi Thomas,
> 
> looks good to me as well. Thanks for the patch.

Committed as r15-7964.

Thanks Harald and Andre!

Best regards

	Thomas
  
Andre Vehreschild March 12, 2025, 12:01 p.m. UTC | #5
Hi Thomas,

I think this patch produced a regression:

FAIL: gfortran.dg/binding_label_tests_26b.f90   -O   (test for errors, line 8)
FAIL: gfortran.dg/binding_label_tests_26b.f90   -O   (test for errors, line 9)

When I revert your patch and test again, above fails do not occur. Could you
please investigate, if I am right?

Regards,
	Andre

On Tue, 11 Mar 2025 17:45:16 +0100
Thomas Koenig <tkoenig@netcologne.de> wrote:

> Am 11.03.25 um 10:22 schrieb Andre Vehreschild:
> > Hi Thomas,
> >
> > looks good to me as well. Thanks for the patch.
>
> Committed as r15-7964.
>
> Thanks Harald and Andre!
>
> Best regards
>
> 	Thomas
>


--
Andre Vehreschild * Email: vehre ad gmx dot de
  
Thomas Koenig March 12, 2025, 5:33 p.m. UTC | #6
Hi Andre,

> FAIL: gfortran.dg/binding_label_tests_26b.f90   -O   (test for errors, line 8)
> FAIL: gfortran.dg/binding_label_tests_26b.f90   -O   (test for errors, line 9)
> 
> When I revert your patch and test again, above fails do not occur. Could you
> please investigate, if I am right?

Jep, I missed that.

The warning in the test case is bogus.  binding_label_tests_26a.f90 has

module fg
contains
   function fffi(f)
     interface
        function f() bind(c)
        end function
     end interface
   end function
end module

so f is a dummy argument, which is not a global entity.

binding_label_tests_26b.f90 has

module f    ! { dg-error "uses the same global identifier" }
   use fg    ! { dg-error "uses the same global identifier" }
end module

so it tests for that error.

The test case should stay, but I will remove the dg-error directives.

Best regards

	Thomas
  
Thomas Koenig March 12, 2025, 5:56 p.m. UTC | #7
Am 12.03.25 um 18:33 schrieb Thomas Koenig:
> 
> The test case should stay, but I will remove the dg-error directives.

Fix committed as obvious and simple as r15-8006 .

Thanks for the heads-up!

Best regards

	Thomas
  

Patch

diff --git a/gcc/fortran/frontend-passes.cc b/gcc/fortran/frontend-passes.cc
index 20bf6e127ff..ef9c80147cc 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 eda31ba8adc..027c99335d1 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);