[Patch, fortran] PR29652 -

Jerry DeLisle jvdelisle@verizon.net
Fri Nov 17 21:39:00 GMT 2006


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



More information about the Gcc-patches mailing list