[Fortran] PR 86116: Ambiguous generic interface not recognised

Message ID CAKwh3qiQs3T=7xF_H+fjHGeoxoWKdriJ=rXZ8bBwVuc1PgnshA@mail.gmail.com
State New
Headers show
Series
  • [Fortran] PR 86116: Ambiguous generic interface not recognised
Related show

Commit Message

Janus Weil Aug. 5, 2018, 1:23 p.m.
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.

Comments

Janus Weil Aug. 14, 2018, 8:09 a.m. | #1
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.
Fritz Reese Aug. 14, 2018, 2:15 p.m. | #2
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.
Janus Weil Aug. 14, 2018, 7:12 p.m. | #3
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.

Patch

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));