Hi all,
here is a patch that fixes a rejects-valid problem with an
unlimited-polymorphic variable in a generic procedure. Removing the
line with UNLIMITED_POLY fixes the error and the rest of the patch is
just slightly refactoring the for-loop.
Regtested successfully on x86_64-linux-gnu. Ok for trunk?
Cheers,
Janus
2016-11-25 Janus Weil <[email protected]>
PR fortran/60853
* interface.c (gfc_compare_interfaces): Remove bad special case for
unlimited polymorphism. Refactor for loop.
2016-11-25 Janus Weil <[email protected]>
PR fortran/60853
* gfortran.dg/typebound_assignment_8.f90: New test case.
Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c (revision 242818)
+++ gcc/fortran/interface.c (working copy)
@@ -1728,11 +1728,9 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol
This is also done when comparing interfaces for dummy procedures and in
procedure pointer assignments. */
- for (;;)
+ for (; f1 || f2; f1 = f1->next, f2 = f2->next)
{
/* Check existence. */
- if (f1 == NULL && f2 == NULL)
- break;
if (f1 == NULL || f2 == NULL)
{
if (errmsg != NULL)
@@ -1741,9 +1739,6 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol
return 0;
}
- if (UNLIMITED_POLY (f1->sym))
- goto next;
-
if (strict_flag)
{
/* Check all characteristics. */
@@ -1772,9 +1767,6 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol
return 0;
}
}
-next:
- f1 = f1->next;
- f2 = f2->next;
}
return 1;
! { dg-do compile }
!
! PR 60853: [OOP] Failure to disambiguate generic with unlimited polymorphic
!
! Contributed by tlcclt <[email protected]>
module foo_mod
implicit none
type Vector
contains
procedure :: copyFromScalar
procedure :: copyFromArray
generic :: assignment(=) => copyFromScalar, copyFromArray
end type
contains
subroutine copyFromScalar(this, scalar)
class (Vector), intent(inout) :: this
type (Vector), intent(in) :: scalar
end subroutine
subroutine copyFromArray(this, array)
class (Vector), intent(inout) :: this
class (*), intent(in) :: array(:)
end subroutine
end module