: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