This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, fortran] PR29652 -
- From: Paul Thomas <paulthomas2 at wanadoo dot fr>
- To: Fortran List <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 15 Nov 2006 19:22:04 +0100
- Subject: [Patch, fortran] PR29652 -
: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