http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47023
--- Comment #15 from janus at gcc dot gnu.org 2011-10-17 19:10:44 UTC --- The following should fix comment #1: Index: gcc/fortran/decl.c =================================================================== --- gcc/fortran/decl.c (revision 180078) +++ gcc/fortran/decl.c (working copy) @@ -1000,20 +1000,24 @@ verify_c_interop_param (gfc_symbol *sym) { if (sym->ns->proc_name->attr.is_bind_c == 1) { - is_c_interop = - (verify_c_interop (&(sym->ts)) - == SUCCESS ? 1 : 0); + is_c_interop = (verify_c_interop (&(sym->ts)) == SUCCESS ? 1 : 0); if (is_c_interop != 1) { /* 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 " + gfc_error ("Variable '%s' at %L is a dummy argument to the " + "BIND(C) 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, sym->ts.u.derived->name); + else if (sym->ts.type == BT_CLASS) + gfc_error ("Variable '%s' at %L is a dummy argument to the " + "BIND(C) procedure '%s' but is not C interoperable " + "because it is polymorphic", + sym->name, &(sym->declared_at), + sym->ns->proc_name->name); else gfc_warning ("Variable '%s' at %L is a parameter to the " "BIND(C) procedure '%s' but may not be C " @@ -3716,6 +3720,8 @@ verify_c_interop (gfc_typespec *ts) if (ts->type == BT_DERIVED && ts->u.derived != NULL) return (ts->u.derived->ts.is_c_interop || ts->u.derived->attr.is_bind_c) ? SUCCESS : FAILURE; + else if (ts->type == BT_CLASS) + return FAILURE; else if (ts->is_c_interop != 1) return FAILURE; It also fixes the wording of the error message for derived types, which uses the terms 'type' and 'parameter' in a wrong way.