OSDN Git Service

2011-11-03 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Nov 2011 22:36:11 +0000 (22:36 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Nov 2011 22:36:11 +0000 (22:36 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180879 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/interface.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/bind_c_dts_5.f90 [new file with mode: 0644]

index f29eab0..ac6e29b 100644 (file)
@@ -1,5 +1,10 @@
 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/50960
        * trans-decl.c (gfc_finish_var_decl): Mark PARAMETER as TREE_READONLY.
 
index 5308513..19ede06 100644 (file)
@@ -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;
index d561072..91d4174 100644 (file)
@@ -1,5 +1,10 @@
 2011-11-03  Tobias Burnus  <burnus@net-b.de>
 
+       PR fortran/50933
+       * gfortran.dg/bind_c_dts_5.f90: New.
+
+2011-11-03  Tobias Burnus  <burnus@net-b.de>
+
        PR fortran/50960
        * gfortran.dg/module_parameter_array_refs_2.f90: New.
 
diff --git a/gcc/testsuite/gfortran.dg/bind_c_dts_5.f90 b/gcc/testsuite/gfortran.dg/bind_c_dts_5.f90
new file mode 100644 (file)
index 0000000..497c050
--- /dev/null
@@ -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" } }