diff options
author | Harald Anlauf <anlauf@gmx.de> | 2023-04-11 16:44:32 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2023-04-12 11:08:59 +0200 |
commit | c482995cc5bac4a2168ea0049041e712544e474b (patch) | |
tree | c741ea5959df64cc3abc134e943aeea410e19fb2 /gcc/fortran/interface.cc | |
parent | 2d7ad38707e1fd71193d440198cc0726092b9015 (diff) | |
download | gcc-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.cc | 18 |
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 |