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



Reply via email to