[Patch, fortran] PR29652 -

Paul Thomas paulthomas2@wanadoo.fr
Wed Nov 15 20:44:00 GMT 2006


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
>   



More information about the Fortran mailing list