Re: walking a namespace to check a symbol name?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: walking a namespace to check a symbol name?

Steve Kargl
On Mon, May 02, 2005 at 12:56:35AM +0200, Tobias Schl?ter wrote:

> Steve Kargl wrote:
> > How does one walk a namespace to determine if a name
> > has previous been used?  The following program is
> > illegal (see PR 21257)
> >
> >    program f
> >    integer i,j
> >    loop: do i = 1, 5
> >             print *, i
> >          end do loop
> >    loop: do j = 1, 5
> >             print *, j
> >          end do loop
> >    end program f
> >
> > because the do-construct-name is not unique (Thanks,
> > Richard for forsing me to read 14.1.2(1) several times).
> > Note, a similar problem also affects if-construct-name
> > and case-construct-name via gfc_match_label() in match.c.
>
> Sounds like you want to call gfc_find_symbol from gfc_match_do, giving an
> error if the symbol already exists.
>
This patch is based on similar code in g95.  I'll note that
we need a better error reporting mechanism and we should probably
throttle the number of errors spewed to the screen.  If you have
nested SELECT CASE constructs with a boat load of CASE statements
and the SELECT CASE constructs have duplicate labels, this patch
will spew a whole bunch of bogus error messages.

2005-06-11  Andy Vaught  <[hidden email]>
            Steven G. Kargl  <[hidden email]>

        PR fortran/21257  
        * match.c (gfc_match_label): Detect duplicate labels.

2005-06-11  Steven G. Kargl  <[hidden email]>

        gfortran.dg/duplicate_label.f90: New test.

Bootstrapped and regression tested on mainline and i386-*-freebsd.

--
Steve

m.diff (1K) Download Attachment
duplicate_labels.f90 (1K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: walking a namespace to check a symbol name?

Tobias Schlüter
Steve Kargl wrote:
> 2005-06-11  Andy Vaught  <[hidden email]>
>             Steven G. Kargl  <[hidden email]>

For the record, Andy requested me to not put his name on ChangeLog entries
(understandably at that time regression mails were sent almost every day).
Rather say 'Ported from g95'.  I'll have a look at your patch later.

- Tobi
Reply | Threaded
Open this post in threaded view
|

PING Re: walking a namespace to check a symbol name?

Steve Kargl
In reply to this post by Steve Kargl
PING


On Sat, Jun 11, 2005 at 07:21:28PM -0700, Steve Kargl wrote:

>
> This patch is based on similar code in g95.  I'll note that
> we need a better error reporting mechanism and we should probably
> throttle the number of errors spewed to the screen.  If you have
> nested SELECT CASE constructs with a boat load of CASE statements
> and the SELECT CASE constructs have duplicate labels, this patch
> will spew a whole bunch of bogus error messages.
>
> 2005-06-11  Andy Vaught  <[hidden email]>
>             Steven G. Kargl  <[hidden email]>
>
> PR fortran/21257  
> * match.c (gfc_match_label): Detect duplicate labels.
>
> 2005-06-11  Steven G. Kargl  <[hidden email]>
>
> gfortran.dg/duplicate_label.f90: New test.
>
> Bootstrapped and regression tested on mainline and i386-*-freebsd.
>
> --
> Steve

> Index: match.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/fortran/match.c,v
> retrieving revision 1.38
> diff -c -p -r1.38 match.c
> *** match.c 4 Jun 2005 10:34:56 -0000 1.38
> --- match.c 12 Jun 2005 02:09:05 -0000
> *************** gfc_match_label (void)
> *** 265,282 ****
>         return MATCH_ERROR;
>       }
>  
> !   if (gfc_new_block->attr.flavor != FL_LABEL
> !       && gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
> ! gfc_new_block->name, NULL) == FAILURE)
> !     return MATCH_ERROR;
>  
> !   for (p = gfc_state_stack; p; p = p->previous)
> !     if (p->sym == gfc_new_block)
> !       {
> ! gfc_error ("Label %s at %C already in use by a parent block",
> !   gfc_new_block->name);
> ! return MATCH_ERROR;
> !       }
>  
>     return MATCH_YES;
>   }
> --- 265,279 ----
>         return MATCH_ERROR;
>       }
>  
> !   if (gfc_new_block->attr.flavor == FL_LABEL)
> !     {
> !       gfc_error ("Duplicate construct label '%s' at %C", name);
> !       return MATCH_ERROR;
> !     }
>  
> !   if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
> !      gfc_new_block->name, NULL) == FAILURE)
> !     return MATCH_ERROR;
>  
>     return MATCH_YES;
>   }

> ! { dg-do compile }
> ! PR 21257
> program dups
>
>   integer i,j,k
>
>   abc: do i = 1, 3
>   abc:    do j = 1, 3    ! { dg-error "Duplicate construct label" }
>               k = i + j
>           end do abc
>        end do abc        ! { dg-error "Expecting END PROGRAM" }
>
>   xyz: do i = 1, 2
>           k = i + 2
>        end do xyz
>   xyz: do j = 1, 5      ! { dg-error "Duplicate construct label" }
>           k = j + 2
>        end do loop      ! { dg-error "Expecting END PROGRAM" }
>
>   her: if (i == 1) then
>   her:    if (j  == 1) then  ! { dg-error "Duplicate construct label" }
>                k = i + j
>           end if her
>        end if her            ! { dg-error "Expecting END PROGRAM" }
>
>   his: if (i == 1) then
>            i = j
>         end if his
>   his: if (j === 1) then    ! { dg-error "Duplicate construct label" }
>            print *, j
>         end if his          ! { dg-error "Expecting END PROGRAM" }
>
>   sgk: select case (i)
>        case (1)
>   sgk:   select case (j)    ! { dg-error "Duplicate construct label" }
>           case (10)
>              i = i + j
>           case (20)
>              j = j + i
>           end select sgk
>         case (2)             ! { dg-error "Unexpected CASE statement" }
>             i = i + 1
>             j = j + 1
>         end select sgk       ! { dg-error "Expecting END PROGRAM" }
>
>   apl: select case (i)
>          case (1)
>             k = 2
>          case (2)
>             j = 1
>          end select apl
>   apl: select case (i)  ! { dg-error "Duplicate construct label" }
>          case (1)       ! { dg-error "Unexpected CASE statement" }
>             j = 2
>          case (2)       ! { dg-error "Unexpected CASE statement" }
>             k = 1
>          end select apl ! { dg-error "Expecting END PROGRAM" }
>
> end program dups


--
Steve
Reply | Threaded
Open this post in threaded view
|

Re: PING Re: walking a namespace to check a symbol name?

Steven Bosscher
On Saturday 18 June 2005 06:43, Steve Kargl wrote:
> PING
>
> On Sat, Jun 11, 2005 at 07:21:28PM -0700, Steve Kargl wrote:
> > This patch is based on similar code in g95.  I'll note that
> > we need a better error reporting mechanism

Rather, a better error recovery system.

> > 2005-06-11  Andy Vaught  <[hidden email]>
> >             Steven G. Kargl  <[hidden email]>
> >
> > PR fortran/21257
> > * match.c (gfc_match_label): Detect duplicate labels.

OK.

Gr.
Steven