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