diff options
author | Janus Weil <janus@gcc.gnu.org> | 2018-08-14 21:09:33 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2018-08-14 21:09:33 +0200 |
commit | 0ce0e6e865f65b34fd20e8ae912ff7307fb5b832 (patch) | |
tree | 76d5839764fbc72cc9f635108cb2a2286d7b135e /gcc/fortran/interface.c | |
parent | b8b5398cbdf99f6c977a6a1749628538ba436a0b (diff) | |
download | gcc-0ce0e6e865f65b34fd20e8ae912ff7307fb5b832.zip gcc-0ce0e6e865f65b34fd20e8ae912ff7307fb5b832.tar.gz gcc-0ce0e6e865f65b34fd20e8ae912ff7307fb5b832.tar.bz2 |
re PR fortran/86116 (Ambiguous generic interface not recognised)
2018-08-14 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-14 Janus Weil <janus@gcc.gnu.org>
PR fortran/86116
* gfortran.dg/generic_34.f90: New test case.
From-SVN: r263540
Diffstat (limited to 'gcc/fortran/interface.c')
-rw-r--r-- | gcc/fortran/interface.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 32aae0e..f85c76b 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -735,13 +735,20 @@ 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) || (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, 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)); @@ -1528,7 +1536,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)); |