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
2011-11-03 Tobias Burnus <bur...@net-b.de>
PR fortran/50933
* interface.c (gfc_compare_derived_types): Fix check for BIND(C).
2011-11-03 Tobias Burnus <bur...@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" } }