aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/interface.cc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2023-04-11 16:44:32 +0200
committerHarald Anlauf <anlauf@gmx.de>2023-04-12 11:08:59 +0200
commitc482995cc5bac4a2168ea0049041e712544e474b (patch)
treec741ea5959df64cc3abc134e943aeea410e19fb2 /gcc/fortran/interface.cc
parent2d7ad38707e1fd71193d440198cc0726092b9015 (diff)
downloadgcc-c482995cc5bac4a2168ea0049041e712544e474b.zip
gcc-c482995cc5bac4a2168ea0049041e712544e474b.tar.gz
gcc-c482995cc5bac4a2168ea0049041e712544e474b.tar.bz2
Fortran: resolve correct generic with TYPE(C_PTR) arguments [PR61615,PR99982]
gcc/fortran/ChangeLog: PR fortran/61615 PR fortran/99982 * interface.cc (compare_parameter): Enable type and rank checks for arguments of derived type from the intrinsic module ISO_C_BINDING. gcc/testsuite/ChangeLog: PR fortran/61615 PR fortran/99982 * gfortran.dg/interface_49.f90: New test.
Diffstat (limited to 'gcc/fortran/interface.cc')
-rw-r--r--gcc/fortran/interface.cc18
1 files changed, 17 insertions, 1 deletions
diff --git a/gcc/fortran/interface.cc b/gcc/fortran/interface.cc
index db79b10..e9843e9 100644
--- a/gcc/fortran/interface.cc
+++ b/gcc/fortran/interface.cc
@@ -2361,7 +2361,23 @@ compare_parameter (gfc_symbol *formal, gfc_expr *actual,
&& formal->ts.u.derived && formal->ts.u.derived->ts.is_iso_c
&& actual->ts.type == BT_DERIVED
&& actual->ts.u.derived && actual->ts.u.derived->ts.is_iso_c)
- return true;
+ {
+ if (formal->ts.u.derived->intmod_sym_id
+ != actual->ts.u.derived->intmod_sym_id)
+ return false;
+
+ if (ranks_must_agree
+ && symbol_rank (formal) != actual->rank
+ && symbol_rank (formal) != -1)
+ {
+ if (where)
+ argument_rank_mismatch (formal->name, &actual->where,
+ symbol_rank (formal), actual->rank,
+ NULL);
+ return false;
+ }
+ return true;
+ }
if (formal->ts.type == BT_CLASS && actual->ts.type == BT_DERIVED)
/* Make sure the vtab symbol is present when