Fortran: procedures with BIND(C) attribute require explicit interface [PR85877]
authorHarald Anlauf <anlauf@gmx.de>
Fri, 17 Mar 2023 21:24:49 +0000 (22:24 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Sun, 19 Mar 2023 19:32:10 +0000 (20:32 +0100)
gcc/fortran/ChangeLog:

PR fortran/85877
* resolve.cc (resolve_fl_procedure): Check for an explicit interface
of procedures with the BIND(C) attribute (F2018:15.4.2.2).

gcc/testsuite/ChangeLog:

PR fortran/85877
* gfortran.dg/pr85877.f90: New test.

gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/pr85877.f90 [new file with mode: 0644]

index ba603b4..f3f3051 100644 (file)
@@ -13871,6 +13871,16 @@ check_formal:
            }
        }
     }
+
+  /* F2018:15.4.2.2 requires an explicit interface for procedures with the
+     BIND(C) attribute.  */
+  if (sym->attr.is_bind_c && sym->attr.if_source == IFSRC_UNKNOWN)
+    {
+      gfc_error ("Interface of %qs at %L must be explicit",
+                sym->name, &sym->declared_at);
+      return false;
+    }
+
   return true;
 }
 
diff --git a/gcc/testsuite/gfortran.dg/pr85877.f90 b/gcc/testsuite/gfortran.dg/pr85877.f90
new file mode 100644 (file)
index 0000000..d8f08cb
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! PR fortran/85877
+! A procedure with the bind(c) attribute shall have an explicit interface
+! Contributed by G. Steinmetz
+
+function f() bind(c)
+  f = 42.
+end
+
+subroutine p
+  bind(c) f     ! { dg-error "must be explicit" }
+  x = f()
+end
+
+function g() bind(c)
+  g = 42.
+end
+
+subroutine s
+  interface
+     function g() bind(c)
+     end function g
+  end interface
+  x = g()
+end