From patchwork Sun Aug 15 09:34:50 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [Fortran] PR45211 - Fix DT BIND(C) check Date: Sat, 14 Aug 2010 23:34:50 -0000 From: Tobias Burnus X-Patchwork-Id: 61751 Message-Id: <4C67B4BA.9000003@net-b.de> To: gcc patches , gfortran , Daniel Kraft Derived types with BIND(C) are interoperable, but the check failed for derived types defined in a module procedure. The reason is that verify_c_interop checks for ts->u.derived->ts.is_c_interop which is only set after calling verify_bind_c_derived_type. However, verify_bind_c_derived_type is called in resolve.c - which is too late for the call to verify_c_interop. Build and regtested on x86-84-linux. OK for the trunk? Tobias 2010-08-15 Tobias Burnus PR fortran/45211 * decl.c (verify_c_interop_param): Remove superfluous space (" "). (verify_c_interop): Handle unresolved DT with bind(C). 2010-08-15 Tobias Burnus PR fortran/45211 * gfortran.dg/bind_c_usage_21.f90: New. Index: gcc/fortran/decl.c =================================================================== --- gcc/fortran/decl.c (Revision 163252) +++ gcc/fortran/decl.c (Arbeitskopie) @@ -991,7 +991,7 @@ verify_c_interop_param (gfc_symbol *sym) /* Make personalized messages to give better feedback. */ if (sym->ts.type == BT_DERIVED) gfc_error ("Type '%s' at %L is a parameter to the BIND(C) " - " procedure '%s' but is not C interoperable " + "procedure '%s' but is not C interoperable " "because derived type '%s' is not C interoperable", sym->name, &(sym->declared_at), sym->ns->proc_name->name, @@ -3612,7 +3612,8 @@ gfc_try verify_c_interop (gfc_typespec *ts) { if (ts->type == BT_DERIVED && ts->u.derived != NULL) - return (ts->u.derived->ts.is_c_interop ? SUCCESS : FAILURE); + return (ts->u.derived->ts.is_c_interop || ts->u.derived->attr.is_bind_c) + ? SUCCESS : FAILURE; else if (ts->is_c_interop != 1) return FAILURE; Index: gcc/testsuite/gfortran.dg/bind_c_usage_21.f90 =================================================================== --- gcc/testsuite/gfortran.dg/bind_c_usage_21.f90 (Revision 0) +++ gcc/testsuite/gfortran.dg/bind_c_usage_21.f90 (Revision 0) @@ -0,0 +1,25 @@ +! { dg-do compile } +! +! PR fortran/45211 +! +! Contributed by Scot Breitenfeld +! +module m +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 m + +! { dg-final { cleanup-modules "m" } }