Message ID | trinity-7cc4f143-7033-4551-af8d-b4fbe021637d-1679089003636@3c-app-gmx-bs05 |
---|---|
State | New |
Headers | show |
Series | Fortran: procedures with BIND(C) attribute require explicit interface [PR85877] | expand |
Hi Harald, > the Fortran standard requires an explicit procedure interface in certain > situations, such as when they have a BIND(C) attribute (F2018:15.4.2.2). > The attached patch adds a check for this. > > Regtested on x86_64-pc-linux-gnu. OK for mainline? While this fixes the ICE, it misses function f() bind(c) f = 42. end subroutine p bind(c) f ! { dg-error "must be explicit" } x = f() end subroutine s interface function g() bind(c) end function g end interface x = g() end where the interface is picked up via a global symbol. This code may not be valid; nagfor rejects it, but I cannot find a constraint at least in the F2022 draft that prohibits it. Hm... might it be better to check for attr->module_procedure || attr->if_source == IFSRC_IFBODY? Best regards Thomas
Hi Thomas, Am 18.03.23 um 19:52 schrieb Thomas Koenig via Gcc-patches: > Hi Harald, > >> the Fortran standard requires an explicit procedure interface in certain >> situations, such as when they have a BIND(C) attribute (F2018:15.4.2.2). >> The attached patch adds a check for this. >> >> Regtested on x86_64-pc-linux-gnu. OK for mainline? > > While this fixes the ICE, it misses > > function f() bind(c) > f = 42. > end > > subroutine p > bind(c) f ! { dg-error "must be explicit" } > x = f() > end what do you mean by "it misses"? I do not see an explicit interface here, only a global symbol. All compiler I tried with the above code reject it one way or the other, e g. Cray: x = f() ^ ftn-954 crayftn: ERROR P, File = pr85877-2.f90, Line = 12, Column = 3 Procedure "f", referenced at line 6 (pr85877-2.f90) must have an explicit interface because one or more arguments have the BIND attribute. > subroutine s > interface > function g() bind(c) > end function g > end interface > x = g() > end > > where the interface is picked up via a global symbol. Is it really true that this is in the spirit of the standard? Is the global declaration above really equivalent to an explicit interface? I would expect legal code to be like: function g() bind(c) g = 42. end subroutine s interface function g() bind(c) end function g end interface x = g() end unless you do it in the context of a module and in the right way. > This code > may not be valid; nagfor rejects it, but I cannot find a > constraint at least in the F2022 draft that prohibits it. I thought that F2018:15.4.2.2 and F2023:15.4.2.2(7) are rather clear and "explicit" on this. IMHO the case of "f" above seems to be excluded and thus not conforming. > Hm... might it be better to check for attr->module_procedure || > attr->if_source == IFSRC_IFBODY? Maybe we should find a set of legal and illegal cases that we can agree upon. Thanks, Harald > Best regards > > Thomas > >
Hi Harald, > Am 18.03.23 um 19:52 schrieb Thomas Koenig via Gcc-patches: >> Hi Harald, >> >>> the Fortran standard requires an explicit procedure interface in certain >>> situations, such as when they have a BIND(C) attribute (F2018:15.4.2.2). >>> The attached patch adds a check for this. >>> >>> Regtested on x86_64-pc-linux-gnu. OK for mainline? >> >> While this fixes the ICE, it misses >> >> function f() bind(c) >> f = 42. >> end >> >> subroutine p >> bind(c) f ! { dg-error "must be explicit" } >> x = f() >> end > > what do you mean by "it misses"? Sorry, that was caused by confusion on my part (and it is better to test an assumption of what the compiler actually does :-) Patch is OK, also for backport. Maybe you can also include the test above, just to make sure. Best regards Thomas
Hi Thomas, Am 19.03.23 um 08:34 schrieb Thomas Koenig via Gcc-patches: > Hi Harald, > >> Am 18.03.23 um 19:52 schrieb Thomas Koenig via Gcc-patches: >>> Hi Harald, >>> >>>> the Fortran standard requires an explicit procedure interface in >>>> certain >>>> situations, such as when they have a BIND(C) attribute >>>> (F2018:15.4.2.2). >>>> The attached patch adds a check for this. >>>> >>>> Regtested on x86_64-pc-linux-gnu. OK for mainline? >>> >>> While this fixes the ICE, it misses >>> >>> function f() bind(c) >>> f = 42. >>> end >>> >>> subroutine p >>> bind(c) f ! { dg-error "must be explicit" } >>> x = f() >>> end >> >> what do you mean by "it misses"? > > Sorry, that was caused by confusion on my part (and it is better > to test an assumption of what the compiler actually does :-) > > Patch is OK, also for backport. Maybe you can also include the > test above, just to make sure. I've added your suggestion to the testcase. Pushed as: https://gcc.gnu.org/g:5426ab34643d9e6502f3ee572891a03471fa33ed > Best regards > > Thomas > > Thanks, Harald
From c48c670ff0ce4f0d2ffb1d43aca2ec1bed1fa2ef Mon Sep 17 00:00:00 2001 From: Harald Anlauf <anlauf@gmx.de> Date: Fri, 17 Mar 2023 22:24:49 +0100 Subject: [PATCH] Fortran: procedures with BIND(C) attribute require explicit interface [PR85877] 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 | 10 ++++++++++ gcc/testsuite/gfortran.dg/pr85877.f90 | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/pr85877.f90 diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 46585879ddc..7ec65f16240 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -13661,6 +13661,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 index 00000000000..675faac0027 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr85877.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } +! PR fortran/85877 +! A procedure with the bind(c) attribute shall have an explicit interface +! Contributed by G. Steinmetz + +subroutine p + bind(c) f ! { dg-error "must be explicit" } + x = f() +end + +subroutine s + interface + function g() bind(c) + end function g + end interface + x = g() +end -- 2.35.3