Re: [PATCH] Fortran: procedures with BIND(C) attribute require explicit interface [PR85877]

2023-03-19 Thread Harald Anlauf via Gcc-patches

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



Re: [PATCH] Fortran: procedures with BIND(C) attribute require explicit interface [PR85877]

2023-03-19 Thread 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.

Best regards

Thomas



Re: [PATCH] Fortran: procedures with BIND(C) attribute require explicit interface [PR85877]

2023-03-18 Thread Harald Anlauf via Gcc-patches

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






Re: [PATCH] Fortran: procedures with BIND(C) attribute require explicit interface [PR85877]

2023-03-18 Thread 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

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



[PATCH] Fortran: procedures with BIND(C) attribute require explicit interface [PR85877]

2023-03-17 Thread Harald Anlauf via Gcc-patches
Dear all,

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?

The PR marks this as a long-time regression, so it might be backported
to all open branches.

Thanks,
Harald

From c48c670ff0ce4f0d2ffb1d43aca2ec1bed1fa2ef Mon Sep 17 00:00:00 2001
From: Harald Anlauf 
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, >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 000..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