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