Message ID | CAKwh3qiQs3T=7xF_H+fjHGeoxoWKdriJ=rXZ8bBwVuc1PgnshA@mail.gmail.com |
---|---|
State | New |
Headers | show |
Series | [Fortran] PR 86116: Ambiguous generic interface not recognised | expand |
ping! Am So., 5. Aug. 2018 um 15:23 Uhr schrieb Janus Weil <janus@gcc.gnu.org>: > > Hi all, > > the attached patch fixes PR 86116 by splitting up the function > 'compare_type' into two variants: One that is used for checking > generic interfaces and operators (keeping the old name), and one that > is used for checking dummy functions and procedure pointer assignments > ('compare_type_characteristics'). The latter calls the former, but > includes an additional check that must not be done when checking > generics. > > Regtests cleanly on x86_64-linux-gnu. Ok for trunk? > > Cheers, > Janus > > > 2018-08-05 Janus Weil <janus@gcc.gnu.org> > > PR fortran/86116 > * interface.c (compare_type): Remove a CLASS/TYPE check. > (compare_type_characteristics): New function that behaves like the old > 'compare_type'. > (gfc_check_dummy_characteristics, gfc_check_result_characteristics): > Call 'compare_type_characteristics' instead of 'compare_type'. > > 2018-08-05 Janus Weil <janus@gcc.gnu.org> > > PR fortran/86116 > * gfortran.dg/generic_34.f90: New test case.
Looks OK to me. On Tue, Aug 14, 2018 at 4:12 AM Janus Weil <janus@gcc.gnu.org> wrote: > > ping! > > > Am So., 5. Aug. 2018 um 15:23 Uhr schrieb Janus Weil <janus@gcc.gnu.org>: > > > > Hi all, > > > > the attached patch fixes PR 86116 by splitting up the function > > 'compare_type' into two variants: One that is used for checking > > generic interfaces and operators (keeping the old name), and one that > > is used for checking dummy functions and procedure pointer assignments > > ('compare_type_characteristics'). The latter calls the former, but > > includes an additional check that must not be done when checking > > generics. > > > > Regtests cleanly on x86_64-linux-gnu. Ok for trunk? > > > > Cheers, > > Janus > > > > > > 2018-08-05 Janus Weil <janus@gcc.gnu.org> > > > > PR fortran/86116 > > * interface.c (compare_type): Remove a CLASS/TYPE check. > > (compare_type_characteristics): New function that behaves like the old > > 'compare_type'. > > (gfc_check_dummy_characteristics, gfc_check_result_characteristics): > > Call 'compare_type_characteristics' instead of 'compare_type'. > > > > 2018-08-05 Janus Weil <janus@gcc.gnu.org> > > > > PR fortran/86116 > > * gfortran.dg/generic_34.f90: New test case.
Am Di., 14. Aug. 2018 um 16:16 Uhr schrieb Fritz Reese <fritzoreese@gmail.com>: > > Looks OK to me. Thanks, Fritz. Committed as r263540. Since this PR is a regression, it should probably be backported to the release branches as well. However, I'll a wait a week or two with that, in order to check for possible problems on trunk ... Cheers, Janus > On Tue, Aug 14, 2018 at 4:12 AM Janus Weil <janus@gcc.gnu.org> wrote: > > > > ping! > > > > > > Am So., 5. Aug. 2018 um 15:23 Uhr schrieb Janus Weil <janus@gcc.gnu.org>: > > > > > > Hi all, > > > > > > the attached patch fixes PR 86116 by splitting up the function > > > 'compare_type' into two variants: One that is used for checking > > > generic interfaces and operators (keeping the old name), and one that > > > is used for checking dummy functions and procedure pointer assignments > > > ('compare_type_characteristics'). The latter calls the former, but > > > includes an additional check that must not be done when checking > > > generics. > > > > > > Regtests cleanly on x86_64-linux-gnu. Ok for trunk? > > > > > > Cheers, > > > Janus > > > > > > > > > 2018-08-05 Janus Weil <janus@gcc.gnu.org> > > > > > > PR fortran/86116 > > > * interface.c (compare_type): Remove a CLASS/TYPE check. > > > (compare_type_characteristics): New function that behaves like the old > > > 'compare_type'. > > > (gfc_check_dummy_characteristics, gfc_check_result_characteristics): > > > Call 'compare_type_characteristics' instead of 'compare_type'. > > > > > > 2018-08-05 Janus Weil <janus@gcc.gnu.org> > > > > > > PR fortran/86116 > > > * gfortran.dg/generic_34.f90: New test case.
Index: gcc/fortran/interface.c =================================================================== --- gcc/fortran/interface.c (revision 263308) +++ gcc/fortran/interface.c (working copy) @@ -735,6 +735,13 @@ compare_type (gfc_symbol *s1, gfc_symbol *s2) if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK)) return true; + return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED; +} + + +static bool +compare_type_characteristics (gfc_symbol *s1, gfc_symbol *s2) +{ /* 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) @@ -741,7 +748,7 @@ compare_type (gfc_symbol *s1, gfc_symbol *s2) || (s1->ts.type == BT_DERIVED && s2->ts.type == BT_CLASS)) return false; - return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED; + return compare_type (s1, s2); } @@ -1309,7 +1316,8 @@ gfc_check_dummy_characteristics (gfc_symbol *s1, g /* Check type and rank. */ if (type_must_agree) { - if (!compare_type (s1, s2) || !compare_type (s2, s1)) + if (!compare_type_characteristics (s1, s2) + || !compare_type_characteristics (s2, s1)) { snprintf (errmsg, err_len, "Type mismatch in argument '%s' (%s/%s)", s1->name, gfc_typename (&s1->ts), gfc_typename (&s2->ts)); @@ -1528,7 +1536,7 @@ gfc_check_result_characteristics (gfc_symbol *s1, return true; /* Check type and rank. */ - if (!compare_type (r1, r2)) + if (!compare_type_characteristics (r1, r2)) { snprintf (errmsg, err_len, "Type mismatch in function result (%s/%s)", gfc_typename (&r1->ts), gfc_typename (&r2->ts));