[fortran] Fix PR 119078, putting a procedure in an abstract interface into global namespace
Commit Message
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
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
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
+
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
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
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
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
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
@@ -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)
@@ -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);