From: Tobias Burnus Date: Tue, 30 Jul 2013 07:20:43 +0000 (+0200) Subject: re PR fortran/57530 ([OOP] Wrongly rejects type_pointer => class_target (which have... X-Git-Tag: releases/gcc-4.9.0~4784 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=60de1c7df5486e81b52c9db5003abba08af7b3f9;p=thirdparty%2Fgcc.git re PR fortran/57530 ([OOP] Wrongly rejects type_pointer => class_target (which have identical declared type)) 2013-07-30 Tobias Burnus PR fortran/57530 * symbol.c (gfc_type_compatible): A type is type compatible with a class if both have the same declared type. * interface.c (compare_type): Reject CLASS/TYPE even if they are type compatible. From-SVN: r201329 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6e00cdc64b03..8faf7ec01e7c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2013-07-30 Tobias Burnus + + PR fortran/57530 + * symbol.c (gfc_type_compatible): A type is type compatible with + a class if both have the same declared type. + * interface.c (compare_type): Reject CLASS/TYPE even if they + are type compatible. + 2013-07-30 Tobias Burnus PR fortran/57530 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 339dd243c127..9055cf538f12 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -514,6 +514,12 @@ compare_type (gfc_symbol *s1, gfc_symbol *s2) if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK)) return 1; + /* TYPE and CLASS of the same declared type are type compatible, + but have different characteristics. */ + if ((s1->ts.type == BT_CLASS && s2->ts.type == BT_DERIVED) + || (s1->ts.type == BT_DERIVED && s2->ts.type == BT_CLASS)) + return 0; + return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED; } diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index c72974dc0033..9d23e8b48a3f 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -4489,6 +4489,9 @@ gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2) if (is_derived1 && is_derived2) return gfc_compare_derived_types (ts1->u.derived, ts2->u.derived); + if (is_derived1 && is_class2) + return gfc_compare_derived_types (ts1->u.derived, + ts2->u.derived->components->ts.u.derived); if (is_class1 && is_derived2) return gfc_type_is_extension_of (ts1->u.derived->components->ts.u.derived, ts2->u.derived);