From a9e88ec6fe9438c79b19601f9c20ef77bea4ef9e Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 3 Nov 2011 23:36:11 +0100 Subject: [PATCH] re PR fortran/50933 (Wrongly regards BIND(C) types as incompatible) 2011-11-03 Tobias Burnus PR fortran/50933 * interface.c (gfc_compare_derived_types): Fix check for * BIND(C). 2011-11-03 Tobias Burnus PR fortran/50933 * gfortran.dg/bind_c_dts_5.f90: New. From-SVN: r180879 --- gcc/fortran/ChangeLog | 5 ++ gcc/fortran/interface.c | 5 +- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gfortran.dg/bind_c_dts_5.f90 | 54 ++++++++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/bind_c_dts_5.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f29eab08abd6..ac6e29ba2ae5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2011-11-03 Tobias Burnus + + PR fortran/50933 + * interface.c (gfc_compare_derived_types): Fix check for BIND(C). + 2011-11-03 Tobias Burnus PR fortran/50960 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 5308513b774a..19ede06cf553 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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d56107240a99..91d4174e1e15 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-03 Tobias Burnus + + PR fortran/50933 + * gfortran.dg/bind_c_dts_5.f90: New. + 2011-11-03 Tobias Burnus PR fortran/50960 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 index 000000000000..497c0501b111 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bind_c_dts_5.f90 @@ -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" } } -- 2.47.2