Patchwork [Fortran] PR45211 - Fix DT BIND(C) check

login
register
mail settings
Submitter Tobias Burnus
Date Aug. 15, 2010, 9:34 a.m.
Message ID <4C67B4BA.9000003@net-b.de>
Download mbox | patch
Permalink /patch/61751/
State New
Headers show

Comments

Tobias Burnus - Aug. 15, 2010, 9:34 a.m.
Derived types with BIND(C) are interoperable, but the check failed for 
derived types defined in a module procedure. The reason is that 
verify_c_interop checks for ts->u.derived->ts.is_c_interop which is only 
set after calling verify_bind_c_derived_type. However, 
verify_bind_c_derived_type is called in resolve.c - which is too late 
for the call to verify_c_interop.

Build and regtested on x86-84-linux.
OK for the trunk?

Tobias
Daniel Kraft - Aug. 15, 2010, 9:44 a.m.
Tobias Burnus wrote:
>  Derived types with BIND(C) are interoperable, but the check failed for 
> derived types defined in a module procedure. The reason is that 
> verify_c_interop checks for ts->u.derived->ts.is_c_interop which is only 
> set after calling verify_bind_c_derived_type. However, 
> verify_bind_c_derived_type is called in resolve.c - which is too late 
> for the call to verify_c_interop.
> 
> Build and regtested on x86-84-linux.
> OK for the trunk?

Ok.  Thanks!

Daniel

Patch

2010-08-15  Tobias Burnus  <burnus@net-b.de>

	PR fortran/45211
	* decl.c (verify_c_interop_param): Remove superfluous space (" ").
	(verify_c_interop): Handle unresolved DT with bind(C).

2010-08-15  Tobias Burnus  <burnus@net-b.de>

	PR fortran/45211
	* gfortran.dg/bind_c_usage_21.f90: New.

Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c	(Revision 163252)
+++ gcc/fortran/decl.c	(Arbeitskopie)
@@ -991,7 +991,7 @@  verify_c_interop_param (gfc_symbol *sym)
 	      /* Make personalized messages to give better feedback.  */
 	      if (sym->ts.type == BT_DERIVED)
 		gfc_error ("Type '%s' at %L is a parameter to the BIND(C) "
-			   " procedure '%s' but is not C interoperable "
+			   "procedure '%s' but is not C interoperable "
 			   "because derived type '%s' is not C interoperable",
 			   sym->name, &(sym->declared_at),
 			   sym->ns->proc_name->name, 
@@ -3612,7 +3612,8 @@  gfc_try
 verify_c_interop (gfc_typespec *ts)
 {
   if (ts->type == BT_DERIVED && ts->u.derived != NULL)
-    return (ts->u.derived->ts.is_c_interop ? SUCCESS : FAILURE);
+    return (ts->u.derived->ts.is_c_interop || ts->u.derived->attr.is_bind_c)
+	   ? SUCCESS : FAILURE;
   else if (ts->is_c_interop != 1)
     return FAILURE;
   
Index: gcc/testsuite/gfortran.dg/bind_c_usage_21.f90
===================================================================
--- gcc/testsuite/gfortran.dg/bind_c_usage_21.f90	(Revision 0)
+++ gcc/testsuite/gfortran.dg/bind_c_usage_21.f90	(Revision 0)
@@ -0,0 +1,25 @@ 
+! { dg-do compile }
+!
+! PR fortran/45211
+!
+! Contributed by Scot Breitenfeld
+!
+module m
+contains
+  FUNCTION liter_cb(link_info) bind(C)
+    USE ISO_C_BINDING
+    IMPLICIT NONE
+
+    INTEGER(c_int) liter_cb
+
+    TYPE, bind(C) :: info_t
+       INTEGER(c_int) :: type
+    END TYPE info_t
+
+    TYPE(info_t) :: link_info
+
+    liter_cb = 0
+  END FUNCTION liter_cb
+end module m
+
+! { dg-final { cleanup-modules "m" } }