:ADDPATCH fortran:
This represents my second contribution in a struggle with the
interface meta-bug PR29670.
This patch corrects a coding error in check_interface1, which compares
two interface lists. The arguments were used as the iterators for
both and, as a result, the inner one was never reset. Thus there
would only be one passage through the inner list for the the first
symbol in the outer. The fix is, of course, to reset the inner
iterator and to use a local pointer for it. The testcase exercises
the original PR, which is associated with a generic interface.
gfortran.dg/defined_operatos_1.f90 had to be modified because one of
the user-defined operator interfaces is now detected to be ambiguous;
his seems like an economical test of this case.
Regtested on Cygwin_NT/amd64 - OK for trunk, 4.2 and 4.1?
Paul
2006-11-15 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29652
* interface.c (check_interface1): Use a local value, instead of the
dummy, as
the inner iterator over interface symbols.
2006-11-15 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29652
* gfortran.dg/generic_7.f90: New test.
* gfortran.dg/defined_operators_1.f90: Add new error.
------------------------------------------------------------------------
Index: gcc/fortran/interface.c
===================================================================
*** gcc/fortran/interface.c (revision 118704)
--- gcc/fortran/interface.c (working copy)
*************** check_interface0 (gfc_interface * p, con
*** 964,975 ****
here. */
static int
! check_interface1 (gfc_interface * p, gfc_interface * q,
int generic_flag, const char *interface_name)
{
!
for (; p; p = p->next)
! for (; q; q = q->next)
{
if (p->sym == q->sym)
continue; /* Duplicates OK here */
--- 964,975 ----
here. */
static int
! check_interface1 (gfc_interface * p, gfc_interface * q0,
int generic_flag, const char *interface_name)
{
! gfc_interface * q;
for (; p; p = p->next)
! for (q = q0; q; q = q->next)
{
if (p->sym == q->sym)
continue; /* Duplicates OK here */
Index: gcc/testsuite/gfortran.dg/generic_7.f90
===================================================================
*** gcc/testsuite/gfortran.dg/generic_7.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/generic_7.f90 (revision 0)
***************
*** 0 ****
--- 1,27 ----
+ ! { dg-do compile }
+ ! Tests the fix for PR29652, in which ambiguous interfaces were not detected
+ ! with more than two specific procedures in the interface.
+ !
+ ! Contributed by Daniel Franke <franke.daniel@gmail.com>
+ !
+ MODULE global
+ INTERFACE iface
+ MODULE PROCEDURE sub_a
+ MODULE PROCEDURE sub_b ! { dg-error "Ambiguous interfaces" }
+ MODULE PROCEDURE sub_c
+ END INTERFACE
+ CONTAINS
+ SUBROUTINE sub_a(x)
+ INTEGER, INTENT(in) :: x
+ WRITE (*,*) 'A: ', x
+ END SUBROUTINE
+ SUBROUTINE sub_b(y)
+ INTEGER, INTENT(in) :: y
+ WRITE (*,*) 'B: ', y
+ END SUBROUTINE
+ SUBROUTINE sub_c(x, y)
+ REAL, INTENT(in) :: x, y
+ WRITE(*,*) x, y
+ END SUBROUTINE
+ END MODULE
+ ! { dg-final { cleanup-modules "global" } }
Index: gcc/testsuite/gfortran.dg/defined_operators_1.f90
===================================================================
*** gcc/testsuite/gfortran.dg/defined_operators_1.f90 (revision 118704)
--- gcc/testsuite/gfortran.dg/defined_operators_1.f90 (working copy)
*************** module mymod
*** 11,17 ****
module procedure foo_1 ! { dg-error "must be INTENT" }
module procedure foo_2 ! { dg-error "cannot be optional" }
module procedure foo_3 ! { dg-error "must have, at most, two arguments" }
! module procedure foo_1_OK
module procedure foo_2_OK
function foo_chr (chr) ! { dg-error "cannot be assumed character length" }
character(*) :: foo_chr
--- 11,17 ----
module procedure foo_1 ! { dg-error "must be INTENT" }
module procedure foo_2 ! { dg-error "cannot be optional" }
module procedure foo_3 ! { dg-error "must have, at most, two arguments" }
! module procedure foo_1_OK ! { dg-error "Ambiguous interfaces" }
module procedure foo_2_OK
function foo_chr (chr) ! { dg-error "cannot be assumed character length" }
character(*) :: foo_chr