Patchwork [Fortran] PR 50933 Fix type-compat check for BIND(C) DT

login
register
mail settings
Submitter Tobias Burnus
Date Nov. 3, 2011, 10:18 p.m.
Message ID <4EB31346.3010206@net-b.de>
Download mbox | patch
Permalink /patch/123517/
State New
Headers show

Comments

Tobias Burnus - Nov. 3, 2011, 10:18 p.m.
gfortran only regarded different decls of SEQUENCE as the same but not 
BIND(C) types.

Interestingly, the c.l.f thread with this example (and some more) was 
already mentioned in the fixed PR fortran/45211 for which only other 
issues were fixed.

Build and regtested on x86-64-linux.
OK?

Tobias
Steve Kargl - Nov. 3, 2011, 10:27 p.m.
On Thu, Nov 03, 2011 at 11:18:46PM +0100, Tobias Burnus wrote:
> gfortran only regarded different decls of SEQUENCE as the same but not 
> BIND(C) types.
> 
> Interestingly, the c.l.f thread with this example (and some more) was 
> already mentioned in the fixed PR fortran/45211 for which only other 
> issues were fixed.
> 
> Build and regtested on x86-64-linux.
> OK?

OK

Patch

2011-11-03  Tobias Burnus  <burnus@net-b.de>

	PR fortran/50933
	* interface.c (gfc_compare_derived_types): Fix check for BIND(C).

2011-11-03  Tobias Burnus  <burnus@net-b.de>

	PR fortran/50933
	* gfortran.dg/bind_c_dts_5.f90: New.

diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 5308513..19ede06 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -405,7 +405,7 @@  gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
     return 1;
 
   /* Compare type via the rules of the standard.  Both types must have
-     the SEQUENCE attribute to be equal.  */
+     the SEQUENCE or BIND(C) attribute to be equal.  */
 
   if (strcmp (derived1->name, derived2->name))
     return 0;
@@ -414,7 +414,8 @@  gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
       || derived2->component_access == ACCESS_PRIVATE)
     return 0;
 
-  if (derived1->attr.sequence == 0 || derived2->attr.sequence == 0)
+  if (!(derived1->attr.sequence && derived2->attr.sequence)
+      && !(derived1->attr.is_bind_c && derived2->attr.is_bind_c))
     return 0;
 
   dt1 = derived1->components;
--- /dev/null	2011-11-01 08:51:46.775606868 +0100
+++ gcc/gcc/testsuite/gfortran.dg/bind_c_dts_5.f90	2011-11-03 23:13:21.000000000 +0100
@@ -0,0 +1,54 @@ 
+! { dg-do compile }
+!
+! PR fortran/50933
+!
+! Check whether type-compatibility checks for BIND(C) work.
+!
+! Contributed by Richard Maine
+!
+
+MODULE liter_cb_mod
+USE ISO_C_BINDING
+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 liter_cb_mod
+
+PROGRAM main
+     USE ISO_C_BINDING
+   interface
+   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
+   END FUNCTION liter_cb
+   end interface
+
+      TYPE, bind(C) :: info_t
+        INTEGER(c_int) :: type
+     END TYPE info_t  
+  type(info_t) :: link_info
+
+  write (*,*) liter_cb(link_info)
+
+END PROGRAM main
+
+! { dg-final { cleanup-modules "liter_cb_mod" } }