This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, fortran] PR29652 -


Paul Thomas wrote:
Ping to somebody other than Steve - this one is really easy.

Paul
Sorry about this - I seem to be all thumbs tonight. The title line should be

[Patch, fortran] PR29652 - ambiguous interface declaration undetected
: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





Yes, simple enough. OK


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]