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.
This commit is contained in:
Thomas Koenig 2025-03-11 17:40:57 +01:00
parent 456924e078
commit 64a551f730
3 changed files with 44 additions and 3 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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