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

Submitted by Tobias Burnus on Nov. 3, 2011, 10:18 p.m.

Details

Message ID 4EB31346.3010206@net-b.de
State New
Headers show

Commit Message

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

Comments

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 hide | download patch | download mbox

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" } }