This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, Fortran, F08] PR 45521: GENERIC resolution with ALLOCATABLE/POINTER and PROCEDURE
- From: Janus Weil <janus at gcc dot gnu dot org>
- To: gfortran <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 4 Aug 2018 16:50:23 +0200
- Subject: [Patch, Fortran, F08] PR 45521: GENERIC resolution with ALLOCATABLE/POINTER and PROCEDURE
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 <janus@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 <janus@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 <janus@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