Hi all, this patch should finally fix up the last wrinkles of PR 45521, which deals with disambiguating specific procedures in a generic interface via the pointer/allocatable attributes of the arguments (legal in F08).
For 'ordinary' generic interfaces this already works (cf. 'generic_correspondence'), but not for operator interfaces, which are treated a bit differently (see 'gfc_compare_interfaces'). The patch basically copies over the usage of 'compare_ptr_alloc' from 'generic_correspondence' to the relevant part of 'gfc_compare_interfaces'. Regtests cleanly on x86_64-linux-gnu. Ok for trunk? Cheers, Janus 2018-08-04 Janus Weil <ja...@gcc.gnu.org> PR fortran/45521 * interface.c (gfc_compare_interfaces): Apply additional distinguishability criteria of F08 to operator interfaces. 2018-08-04 Janus Weil <ja...@gcc.gnu.org> PR fortran/45521 * gfortran.dg/interface_assignment_6.f90: New test case.
Index: gcc/fortran/interface.c =================================================================== --- gcc/fortran/interface.c (revision 263178) +++ gcc/fortran/interface.c (working copy) @@ -1776,7 +1776,7 @@ } else { - /* Only check type and rank. */ + /* Operators: Only check type and rank of arguments. */ if (!compare_type (f2->sym, f1->sym)) { if (errmsg != NULL) @@ -1794,6 +1794,15 @@ symbol_rank (f2->sym)); return false; } + if ((gfc_option.allow_std & GFC_STD_F2008) + && (compare_ptr_alloc(f1->sym, f2->sym) + || compare_ptr_alloc(f2->sym, f1->sym))) + { + if (errmsg != NULL) + snprintf (errmsg, err_len, "Mismatching POINTER/ALLOCATABLE " + "attribute in argument '%s' ", f1->sym->name); + return false; + } } }
! { dg-do compile } ! ! PR 45521: [F08] GENERIC resolution with ALLOCATABLE/POINTER and PROCEDURE ! ! Contributed by Janus Weil <ja...@gcc.gnu.org> module inteface_assignment_6 type :: t end type ! this was rejected as ambiguous, but is valid in F08 interface assignment(=) procedure testAlloc procedure testPtr end interface contains subroutine testAlloc(obj, val) type(t), allocatable, intent(out) :: obj integer, intent(in) :: val end subroutine subroutine testPtr(obj, val) type(t), pointer, intent(out) :: obj integer, intent(in) :: val end subroutine end