From: Janus Weil Date: Fri, 7 Sep 2018 18:01:23 +0000 (+0200) Subject: backport: re PR fortran/86116 (Ambiguous generic interface not recognised) X-Git-Tag: releases/gcc-6.5.0~80 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e6a17dcfb8c7826d792a39b2b80add958dcd2c45;p=thirdparty%2Fgcc.git backport: re PR fortran/86116 (Ambiguous generic interface not recognised) 2018-09-07 Janus Weil Backported from trunk 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-09-07 Janus Weil Backported from trunk PR fortran/86116 * gfortran.dg/generic_34.f90: New test case. From-SVN: r264162 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ce30a70c4c45..da0673c685c1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2018-09-07 Janus Weil + + Backported from trunk + 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-07-03 Paul Thomas PR fortran/82969 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 725ffd18ed24..d4ca4366695c 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -638,13 +638,20 @@ compare_type (gfc_symbol *s1, gfc_symbol *s2) if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK)) return 1; + 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) || (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; + return compare_type (s1, s2); } @@ -1190,7 +1197,8 @@ gfc_check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2, /* 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)); @@ -1409,7 +1417,7 @@ gfc_check_result_characteristics (gfc_symbol *s1, gfc_symbol *s2, 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)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 47c5b77a16bb..726699b6ecb7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-09-07 Janus Weil + + Backported from trunk + PR fortran/86116 + * gfortran.dg/generic_34.f90: New test case. + 2018-09-03 Tom de Vries backport from trunk: diff --git a/gcc/testsuite/gfortran.dg/generic_34.f90 b/gcc/testsuite/gfortran.dg/generic_34.f90 new file mode 100644 index 000000000000..1bcbfa089fa7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/generic_34.f90 @@ -0,0 +1,27 @@ +! { dg-do compile } +! +! PR 86116: [6/7/8/9 Regression] Ambiguous generic interface not recognised +! +! Contributed by martin + +module mod + + type :: t + end type t + + interface sub + module procedure s1 + module procedure s2 + end interface + +contains + + subroutine s1(x) ! { dg-error "Ambiguous interfaces in generic interface" } + type(t) :: x + end subroutine + + subroutine s2(x) ! { dg-error "Ambiguous interfaces in generic interface" } + class(*), allocatable :: x + end subroutine + +end