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)
/* 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)
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);
--- /dev/null
+! { 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
+